Ошибка сегментации при вызове удаления - PullRequest
2 голосов
/ 07 декабря 2011

обратная трассировка gdb:

#0  0x0040cea9 in free () from /lib/tls/i686/cmov/libc.so.6
#1  0x0033c741 in operator delete(void*) () from /usr/lib/libstdc++.so.6
#2  0x080654b6 in mesh::calculateMeanNormalsPerVertex (this=0x807d684)
    at /home/brent/Desktop/protCAD/src/math/mesh.cc:230
#3  0x0805638f in buildCubes (argc=4, argv=0xbffff3e4)
    at /home/brent/Desktop/protCAD/src/driver/executeCubes.cc:163
#4  main (argc=4, argv=0xbffff3e4)
    at /home/brent/Desktop/protCAD/src/driver/executeCubes.cc:297

Объявление и delete вызов mesh.cc:

vector<vector<int> > faceIndicesPerVertex (vertexArray.size());
...
delete[] &faceIndicesPerVertex;    //line 230

Я уверен, что я ошибся, но я попробовалтам есть несколько разных способов вызова delete, но, похоже, ни один из них не скомпилируется, кроме приведенного выше.В чем проблема?

Ответы [ 6 ]

7 голосов
/ 07 декабря 2011

Вам не нужно delete любой объект, выделенный стеком, включая объект vector, выделенный стеком - он будет уничтожен, а его память будет освобождена, когда объект выйдет из области видимости.Попытка delete объекта, выделенного из стека, приводит к неопределенному поведению (сбой в вашем случае).

3 голосов
/ 07 декабря 2011

Прежде всего, faceIndicesPerVertex не является массивом, поэтому вы не можете вызвать delete[].

И второе, faceIndicesPerVertex - локальная переменная. Это означает, что это в стеке. Это означает, что вы не можете использовать delete на нем.

Используйте delete только для объектов, которые вы выделяете в куче с new.

2 голосов
/ 07 декабря 2011

Вам не нужно звонить delete[]. Это автоматически назначаемая переменная / контейнер, она будет автоматически уничтожена / освобождена память.

Звоните delete, когда вы звоните new, и наоборот. То же самое для new[] и delete[].

1 голос
/ 07 декабря 2011

Насколько я знаю, delete используется только для освобождения памяти из кучи.Вы не можете удалить выделенную в стеке память, используя delete.Как правило, delete память только в том случае, если вы динамически выделяете ее, используя new.У меня также были некоторые проблемы с использованием new/delete.Если вы будете следовать общему правилу использования new и delete в парах, у вас все будет хорошо.

1 голос
/ 07 декабря 2011

faceIndicesPerVertex не является указателем, поэтому delete[] не требуется.
faceIndicesPerVertex является vector, поэтому delete[] даже не будет работать.

1 голос
/ 07 декабря 2011

faceIndicesPerVertex не указатель, он был размещен в стеке. Вы не можете удалить его, и вам не нужно.

...