当前位置:C++技术网 > 资讯 > 结构体封装的STL string,通过new新建对象后通过delete释放报错

结构体封装的STL string,通过new新建对象后通过delete释放报错

更新时间:2016-08-10 20:04:15浏览次数:1+次

例如,一个链表节点:

struct node

{

    string data; //STL string

    node *next;

}

int main()

{

    node* head = new node[sizeof(node)];

    head->data = "123";

    head->next = NULL;

    delete head;   //报错

    return 0;

}


C++技术网解答:

问题描述:结构体封装的STL string,通过new新建对象后通过delete释放报错

注:请将描述写描述部分。报错请提供报错的详细信息,方便定位问题,而不是直接说报错。描述应该尽可能详细,否则解答一是耗时去找什么问题,还不一定是你遇到的问题。必要时,上图。

完整的代码应该是这样的:


#include <iostream> //所给代码缺少
using namespace std;//所给代码缺少
#include <string>//所给代码缺少
struct node
{
    string data; //STL string
    node *next;
};//所给代码缺少

int main()
{
    node* head = new node[sizeof(node)];
    head->data = "123";
    head->next = NULL;
    delete head;   //报错
    return 0;
}


错误提示关键没有描述也没有截图,下面是截图:

    图中框出来的是错误的地方,有了这些错误信息,才好快速找到问题关键和解答。有的都可以直接解答,而不用创建工程,这样解答就很快,请以后提问时注意提供尽可能多的信息。

    点击错误提示的【重试】按钮,这样可以跳转到内部的错误代码中,可以进行跟踪查看。如果点击【中止】那么就直接停止程序了,对于调试没有意义。忽略的话,如果跳不过去这个错误,还是会最终进入错误点。

    点击中止后弹出的界面:

    黄色的光标定位的位置就是内部错误的代码,实际上是断言错误。断言错误就是说,执行到这个位置,不应该出现的数据状态竟然出现了。在Debug模式下会出现这样的错误提示。如果是Release模式下,表现为程序已停止运行。

    再点击【中断】按钮,开始调试分析。

    断言错误出现的函数代码完整如下:


void operator delete(void *pUserData)
{
    _CrtMemBlockHeader * pHead;
    RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
    if (pUserData == NULL)
        return;
    _mlock(_HEAP_LOCK);  /* block other threads */

    __TRY
    /* get a pointer to memory block header */
    pHead = pHdr(pUserData);
    /* verify block type 代码断言错误的位置*/
    _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
    _free_dbg( pUserData, pHead->nBlockUse );
    __FINALLY
        _munlock(_HEAP_LOCK);  /* release other threads */
    __END_TRY_FINALLY
    return;
}
     这里实际是重载delete操作符的函数,里面的代码就是delete释放内存的时候执行的代码。delete操作符内部重载函数的执行过程逻辑分析,请阅读《delete的内部执行逻辑深入分析

    verify block type是校验内存块类型,也就是你释放的类型和应该释放的类型是否匹配,如果不匹配就会断言报错。然后回去检查你的代码,head指向的是node数组,不是单个node节点。对于数组的释放,要用delete[],而不是直接delete。

    所以,错误就在这里。正确的代码:

#include <iostream>
using namespace std;
#include <string>
struct node
{
    string data; //STL string
    node *next;
};

int main()
{
    node* head = new node[sizeof(node)];
    head->data = "123";
    head->next = NULL;
    delete[] head;//报错,数组用delete[]来释放。
    return 0;
}
     开始还被误导了,以为是STL的string会动态分配内存引起的,看到错误提示,才发觉不对劲,然后看new,一切就明白了。低级语法错误引起的。

    不过,解答提供的调试方法可以参考学习一下,以后遇到问题,可以用这样的跟踪调试方法去确定。