boost :: python ошибка памяти с динамическим массивом c и оператором удаления - PullRequest
1 голос
/ 10 июля 2020

У меня есть этот код, который я использую для проверки скорости кода C ++ по сравнению с исходным кодом python (я использовал массив указателей, чтобы убедиться, что данные находятся в одном непрерывном блоке, и потому что вектор должен делать копии, когда он растет, что занимает время O (N)):

void MyClass::test_packet(){
    time_t t1;
    time(&t1);
    PacketInfo* packets;
    for(int i = 0; i < 336000; i++){
        for(int j = 0; j < 18; j++){
            int N = 18;
            // allocate memory for 18 objects in a continous block
            packets = new PacketInfo[N];
            // create the packetInfo objects
            packets[i] = PacketInfo(i, i);
            // free the 18 memory blocks
            delete[] packets;
        }
    }

    time_t t2;
    time(&t2);
    cout << "total time for 336000 * 18 packets : " << (t2 - t1) << "seconds" << endl;
}
BOOST_PYTHON_MODULE(MyClass)
{
    class_<MyClass>("MyClass", init< /*parameter types go here */>())
        // some other functions
        .def("test", &MyClass::test_packet);
}

тестовый файл python выглядит так:

from MyClass import *
MyClass.test()

это дало мне двойной ошибка свободной или поврежденной памяти:

*** Error in `python3': double free or corruption (!prev): 0x00000000016b1b10 ***

Я прокомментировал оператор delete [], но это дало мне ошибку сегментации:

Erreur de segmentation (core dumped)

Есть идеи, как это исправить?

Спасибо

1 Ответ

2 голосов
/ 10 июля 2020

Здесь какой-то неправильный код

for(int i = 0; i < 336000; i++){
    for(int j = 0; j < 18; j++){
        int N = 18;
        // allocate memory for 18 objects in a continous block
        packets = new PacketInfo[N];
        // create the packetInfo objects
        packets[i] = PacketInfo(i, i);

Если i больше 18 (что, очевидно, будет), то packets[i] будет доступом к массиву вне границ.

Альтернатива с packets[j] не имеет особого смысла, так как распределение размещено неправильно относительно l oop (предположительно, оно должно быть перед l oop).

Плюс ваше утверждение about vector неверно.

vector<PacketInfo> packets(18);

выделит вектор размером 18 с 18 непрерывными элементами, и, поскольку вектор не растет, перераспределение также отсутствует.

Просматривая ваши комментарии в code Я думаю, что вы хотели написать код

for(int i = 0; i < 336000; i++){
    int N = 18;
    // allocate memory for 18 objects in a continous block
    vector<PacketInfo> packets(N);
    for(int j = 0; j < N; j++){
        // create the packetInfo objects
        packets[i] = PacketInfo(i, i);
    }
}
...