Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理delete命令时出现分段错误_C++_Vector_Segmentation Fault_Delete Operator - Fatal编程技术网

C++ 处理delete命令时出现分段错误

C++ 处理delete命令时出现分段错误,c++,vector,segmentation-fault,delete-operator,C++,Vector,Segmentation Fault,Delete Operator,我有一个程序,它使用一个向量(称为_库),保存我创建的类“thread”的对象(保存一组数据,并在其构造函数中分配一些内容) 现在,我尝试运行我的程序,调用以下命令行: delete (_library[_currRunning]); ->从我的编译器那里得到了可怕的分段错误信息 我不明白这里的问题是什么,因为我执行边界检查,而且-更令人惊讶的是:当我以前测试过它时,它在其他输入上工作 一般来说,当使用“delete”时,什么会导致分段错误?如何在代码中防止此类错误 此外,我还有一个用于“th

我有一个程序,它使用一个向量(称为_库),保存我创建的类“thread”的对象(保存一组数据,并在其构造函数中分配一些内容)

现在,我尝试运行我的程序,调用以下命令行:

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”是否有问题?