处理删除命令时出现分段错误
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
。如果向量包含值,它甚至不会编译。
我的声明如下:vectorstd::vector<thread*>
,则需要显式释放资源【参考方案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'有什么问题吗?以上是关于处理删除命令时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章