вектор с reinterpret_cast - PullRequest
       48

вектор с reinterpret_cast

0 голосов
/ 13 марта 2019

Следующий код вставляет только одно значение в вектор col. Код извлекается из базы кода СУБД (для импорта файлов), в частности, из 1

Код использует void * для возможности чтения любого типа поля (int, float и т. Д.).

#include <iostream>
#include <vector>
using namespace std;

void add(std::vector<void*> &col){
  reinterpret_cast<std::vector<int>&>(col).push_back( 1);
  reinterpret_cast<std::vector<int>&>(col).push_back( 2);
  reinterpret_cast<std::vector<int>&>(col).push_back( 13);
}
int main() {
 std::vector<void*> col;

 add(col);
 cout << col.size() << endl;
 for(int i=0;i<col.size();i++)
    cout <<reinterpret_cast<std::vector<int>&> (col)[i] <<endl;
    return 0;
}

Я не уверен, как работает этот код?

1 Ответ

6 голосов
/ 13 марта 2019

Ваш код демонстрирует неопределенное поведение .

std::vector<void*> и std::vector<int> - это два совершенно разных и не связанных между собой типа, вы не можете безопасно разыграть их между собой, тем более что вы не можете гарантировать, что void* и int имеют одинаковый размер байта. .

Приведите значения , которые вы нажимаете, не применяйте саму vector, например:

#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;

void add(std::vector<void*> &col) {
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(1)));
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(2)));
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(13)));
}

int main() {
    std::vector<void*> col;

    add(col);

    cout << col.size() << endl;
    for(int i=0;i<col.size();i++)
        cout << reinterpret_cast<intptr_t>(col[i]) << endl;

    return 0;
}

Конечно, вы действительно должны использовать правильный тип контейнера для начала:

#include <iostream>
#include <vector>
using namespace std;

void add(std::vector<int> &col) {
    col.push_back(1);
    col.push_back(2);
    col.push_back(13);
}

int main() {
    std::vector<int> col;

    add(col);

    cout << col.size() << endl;
    for(int i=0;i<col.size();i++)
        cout << col[i] << endl;

    return 0;
}
...