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

У меня есть программа, использующая вектор (называемый _library), в котором хранятся объекты созданного мной класса 'thread' (содержит набор данных и выделяет некоторые вещи в своем конструкторе).

Теперь я попытался запустить свою программу, вызвав эту строку:

delete (_library[_currRunning]);

-> и получил страшное сообщение об ошибке сегментации от моего компилятора.

Я не понимаю, чтоздесь проблема, так как я выполняю граничные проверки и - что более удивительно: он работает на других входах, когда я тестировал его раньше!

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

Кроме того, у меня есть деструктор для класса' thread ', содержащий одну строку:

delete (_stack); 

где _stack - этосимвол *, который я выделил в Ctor.

Вот мои поля объекта 'thread':

char* _stack;  
int _tid;  
void (*_thread_func)(void);  
sigjmp_buf _jbuf;  
Sync* _sync;  
int _status; 

В Ctor 'thread' есть (между другими) эта строка:

_stack = new char[STACK_SIZE]; 

Иэто его Dtor:

delete[] _stack;    

В моей большой программе у меня есть это объявление:

vector<thread*> _library;  

Есть ли проблема с использованием «delete» внутри моего деструктора вместо «бесплатно?

Ответы [ 5 ]

1 голос
/ 17 марта 2011

, если вы распределили _stack следующим образом:

_stack = new char[SOME_LEN];

Вы хотите удалить его с помощью

delete[] _stack;

обратите внимание на [] после удаления, которое необходимо при выделении массива.

1 голос
/ 17 марта 2011

Предполагая, что _libray [_currRunning] содержит указатель, либо:

  1. _library[_currRunning] является недействительным адресом
  2. _library[_currRunning] уже удалено

Если это второй случай, убедитесь, что вы удалили элемент из вектора (используя erase) после его удаления.

РЕДАКТИРОВАТЬ: Под "недействительным" я имею в видуадрес объекта, который не был создан с помощью new.

1 голос
/ 17 марта 2011

Имея очень мало информации, которую вы предоставили, я предполагаю, что вы дважды освобождаете один из объектов потока. Ваша проблема не в vector, а в управлении потоками в течение жизни.

0 голосов
/ 17 марта 2011

Если ваш _currRunning не является указателем, созданным в какой-то момент с новым, удаление будет иметь последствия. Э.Г.

void func()
{
   int a = 1;
   int* b = new int(2);
   delete b; // Ok, deleting a pointer
   delete a; // Can't delete non-pointer - should be a compilation error (?)
   delete &a; // This will call the destructor of a, but then the program 
              // will segfault when a goes out of scope at the end of this function.
}
0 голосов
/ 17 марта 2011

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

...