C++ 处理delete命令时出现分段错误
我有一个程序,它使用一个向量(称为_库),保存我创建的类“thread”的对象(保存一组数据,并在其构造函数中分配一些内容) 现在,我尝试运行我的程序,调用以下命令行:C++ 处理delete命令时出现分段错误,c++,vector,segmentation-fault,delete-operator,C++,Vector,Segmentation Fault,Delete Operator,我有一个程序,它使用一个向量(称为_库),保存我创建的类“thread”的对象(保存一组数据,并在其构造函数中分配一些内容) 现在,我尝试运行我的程序,调用以下命令行: delete (_library[_currRunning]); ->从我的编译器那里得到了可怕的分段错误信息 我不明白这里的问题是什么,因为我执行边界检查,而且-更令人惊讶的是:当我以前测试过它时,它在其他输入上工作 一般来说,当使用“delete”时,什么会导致分段错误?如何在代码中防止此类错误 此外,我还有一个用于“th
delete (_library[_currRunning]);
->从我的编译器那里得到了可怕的分段错误信息
我不明白这里的问题是什么,因为我执行边界检查,而且-更令人惊讶的是:当我以前测试过它时,它在其他输入上工作
一般来说,当使用“delete”时,什么会导致分段错误?如何在代码中防止此类错误
此外,我还有一个用于“thread”类的析构函数,只有一行:
delete (_stack);
其中_stack是我在Ctor中分配的字符*
以下是我的“线程”对象字段:
char* _stack;
int _tid;
void (*_thread_func)(void);
sigjmp_buf _jbuf;
Sync* _sync;
int _status;
在“线程”Ctor中,有(其他线程之间)这一行:
_stack = new char[STACK_SIZE];
这是它的Dtor:
delete[] _stack;
在我的大计划中,我有一个宣言:
vector<thread*> _library;
vector\u库;
在我的析构函数中使用“delete”而不是“free”有什么问题吗?你不需要
删除向量的任何对象-它会自己清理它们。很可能,您打算使用vector.erase()
将其删除。假设库[\u currRunning]包含指针,或者:
\u库[\u currRunning]
是无效地址
\u库[\u currRunning]
已被删除
如果是第二种情况,请确保在删除元素后将其从向量中删除(使用erase
)
编辑:所说的“无效”,我指的是一个对象的地址,该对象不是用new
创建的,而您提供的信息很少。我假设您正在双重释放一个线程对象。您的问题不在于vector
,而在于线程的生命周期管理。除非您的\u 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.
}
如果您这样分配了_堆栈:
_stack = new char[SOME_LEN];
您想使用删除它吗
delete[] _stack;
请注意在分配数组时需要的删除后的[]。库的确切类型是什么?显然,您没有直接删除线程对象。另外,如果你能在segfault发生时给我们提供堆栈跟踪,这将非常有帮助。你需要发布更多的代码。你仍然错过了重要的部分。如何用线程*
对象填充向量\u库
,并取消分配它。正如您所说,分段错误是通过以下方式发生的-delete(_library[_currRunning])代码>我得到的印象是,你不是一个经验丰富的软件工程师。至少你不熟悉C++开发。但看起来您正在尝试编写自己的线程库。为什么?我怀疑这是问题所在:如果向量包含指针,那么可能需要delete
。如果向量包含值,它甚至不会编译;完成程序时它会调用线程的Dtor吗?@Shoshke-不会,它不会调用。如果向量的类型为std::vector
,则需要显式取消分配资源,以便以后在我的程序中使用,我不想使用擦除,而是将NULL保存在它的位置。(我知道这不好,但它大大简化了我的代码)然后将\u library[\u currRunning]
设置为NULL
<空指针上的code>delete
保证是不可操作的。但是,确保以后不要调用空指针上的方法:可怕的事情会发生。但是如果我不使用delete,我在线程中分配的堆栈(char*)将不会被释放,是吗?如果你在线程上调用delete
,它将调用线程的析构函数,该析构函数删除\u堆栈
@spbot这就是为什么我尝试在线程对象上使用“delete”解除分配线程的堆栈,但这似乎不起作用。..@Shoshke-显示您正在执行的更多代码。检查向量的大小和\u currRunning
的值。在析构函数中使用“delete”而不是使用“free”是否有问题?