处理删除命令时出现分段错误

时间:2011-03-17 19:51:54

标签: c++ vector segmentation-fault delete-operator

我有一个程序,它使用一个向量(称为_library)来保存我创建的类'thread'的对象(保存一组数据,并在其构造函数中分配一些东西)。

现在,我尝试运行我的程序,调用此行:

delete (_library[_currRunning]);

- >并从我的编译器获得了可怕的Segmentation错误消息。

我不明白这里有什么问题,因为我执行边界检查,并且 - 更令人惊讶的是:当我之前测试过时,它适用于其他输入!

一般情况下,使用“删除”时可能导致分段错误的原因,以及如何在代码中防止此类错误?

另外,我有一个'thread'类的析构函数,有这一行:

delete (_stack); 

其中_stack是我在Ctor中分配的char *。

这是我的'线程'对象字段:

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

在'thread'Ctor中,这行之间存在(

_stack = new char[STACK_SIZE]; 

这就是它的Dtor:

delete[] _stack;    

在我的大项目中,我有这个声明:

vector<thread*> _library;  

在我的析构函数中使用'delete'是否有问题,而不是使用'free'?

5 个答案:

答案 0 :(得分:1)

假设_libray [_currRunning]包含指针,可以:

  1. _library[_currRunning]是无效地址
  2. _library[_currRunning]已被删除
  3. 如果是第二种情况,请确保在删除后从向量中删除元素(使用erase)。

    编辑:“无效”是指未使用new创建的对象的地址。

答案 1 :(得分:1)

由于您提供的信息非常少,我会假设您正在双重释放其中一个线程对象。您的问题不在于vector,而在于您对线程的生命周期管理。

答案 2 :(得分:1)

如果你像这样分配_stack:

_stack = new char[SOME_LEN];

你想用

删除它
delete[] _stack;

注意在分配数组后需要删除后的[]。

答案 3 :(得分:0)

你不需要delete任何矢量对象 - 它会自行清理它们。可能,您打算使用vector.erase()删除它。

答案 4 :(得分:0)

除非你的_currRunning是某个用new创建的指针,否则删除会产生影响。 E.g。

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.
}