我有一个程序,它使用一个向量(称为_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'?
答案 0 :(得分:1)
假设_libray [_currRunning]包含指针,可以:
_library[_currRunning]
是无效地址_library[_currRunning]
已被删除如果是第二种情况,请确保在删除后从向量中删除元素(使用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.
}