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

Posted

技术标签:

【中文标题】处理删除命令时出现分段错误【英文标题】:Segmentation fault during processing delete command 【发布时间】:2011-03-17 19:51:53 【问题描述】:

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

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

delete (_library[_currRunning]);

->从我的编译器那里得到了可怕的分段错误消息。

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

一般来说,使用“删除”时会导致分段错误的原因是什么?如何防止我的代码中出现此类错误?

此外,我有一个“线程”类的析构函数,只有一行:

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”有什么问题吗?

【问题讨论】:

_library 的确切类型是什么?显然,您不会直接删除 thread 对象。此外,如果您能在发生段错误时向我们提供堆栈跟踪,那将非常有帮助。 你需要发布比这更多的代码。 你仍然错过了重要的部分。向量 _library 如何填充 thread* 对象并释放它。正如你所说,分段错误由此发生 - delete (_library[_currRunning]); 我的印象是您不是一位资深的软件工程师。至少你不熟悉 C++ 开发。然而,看起来您正在尝试编写自己的线程库。为什么? 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果你像这样分配_stack:

_stack = new char[SOME_LEN];

你想删除它

delete[] _stack;

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

【讨论】:

@Shoshke - 显示更多关于你在做什么的代码。检查向量的size_currRunning的值是什么。【参考方案3】:

假设 _libray[_currRunning] 包含一个指针,要么:

    _library[_currRunning] 是无效地址 _library[_currRunning] 已被删除

如果是第二种情况,请确保在删除后将元素从向量中删除(使用erase)。

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

【讨论】:

为了以后在我的程序中使用,我不想使用擦除,而是将 NULL 保存在它的位置。 (我知道这不好,但它大大简化了我的代码) 然后将_library[_currRunning] 设置为NULL。空指针上的delete 保证为无操作。但是,请确保之后不要在空指针上调用方法:会发生可怕的事情。 但是如果我不使用删除,我在线程中分配的堆栈(char*)不会被释放,对吗? 如果你在你的线程上调用delete,它会调用线程的析构函数,从而删除_stack @spbots 这就是为什么我尝试在线程对象上使用“删除”来释放线程堆栈,但这似乎不起作用..【参考方案4】:

你不需要delete 向量的任何对象——它会自己清理它们。很可能,您打算使用 vector.erase() 将其删除。

【讨论】:

我怀疑这是问题所在:如果向量包含指针,则可能需要delete。如果向量包含值,它甚至不会编译。 我的声明如下:vector _library;程序结束时会调用线程的Dtor吗? @Shoshke - 不,它不会调用。如果向量的类型为std::vector&lt;thread*&gt;,则需要显式释放资源【参考方案5】:

除非您的 _currRunning 是在某个时刻用 new 创建的指针,否则 delete 会产生影响。例如

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.

【讨论】:

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

以上是关于处理删除命令时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 Set 时出现编译器分段错误

删除模板数组时出现分段错误[重复]

将结构插入地图时出现分段错误

分配时出现分段错误[重复]

删除以结构为键的地图时出现分段错误

处理二维数组时出现分段错误[关闭]