首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ -删除std::string*;堆损坏

C++ -删除std::string*;堆损坏
EN

Stack Overflow用户
提问于 2012-08-13 03:47:37
回答 5查看 1.3K关注 0票数 1

我是C++内存管理的新手,我遇到了堆损坏的奇怪错误(以及在此之前Visual Studio中的一个自动断点)。下面是有问题的代码:

代码语言:javascript
运行
复制
z_world::z_world(char* name)
{
    unsigned int i, skip;
    char tmp;

    //Load data from file
    std::string* data = loadString(name);

    //Base case if there is no world data
    tiles = NULL;

    w = 0;
    h = 0;

    if(data->length() > 0) {
        //Set up the 'tiles' array
        for(i = 0; i < data->length(); i++) {
            if(data->at(i) == '\n')
                h++;
            if(h == 0)
                w++;
        }
        tiles = new int[data->length()-h];

        //Load Data
        skip = 0;
        for(i = 0; i < data->length(); i++) {
            if(data->at(i) == '\n') {
                skip++;
                printf("\n");
                continue;
            }
            tmp = data->at(i);
            tiles[i+skip] = atoi(&tmp);
            printf("%i ",tiles[i+skip]);
        }
    }
    delete data;
}

下面是我在字符串中加载的位置:

代码语言:javascript
运行
复制
std::string* loadString(char* name)
{
    ifstream in(name);
    std::string* input = new string();

    while(in) {
        std::string line;
        getline(in,line);
        input->append(line);
        input->append("\n");
    }

    in.close();

    return input;
}

我在"delete data;“中得到了断点和错误,这让我认为"data”在此之前被删除了,但我找不到它会在哪里被删除。作为参考,此方法创建一个对象,该对象以虚拟2D整数数组的形式(用于tiles的ID)包含游戏的世界数据。

EN

Stack Overflow用户

发布于 2012-08-13 03:54:16

在您所展示的代码中,不需要动态分配字符串。将loadString函数更改为

代码语言:javascript
运行
复制
std::string loadString(char* name)
{
    ifstream in(name);
    std::string input;

    // ...

    return input;
}

在调用方中

代码语言:javascript
运行
复制
std::string data = loadString( name );

现在不需要在完成后对字符串执行delete操作。

而不是

代码语言:javascript
运行
复制
int *tiles = NULL;
tiles = new int[data->length()-h];

使用

代码语言:javascript
运行
复制
std::vector<int> tiles;
tiles.resize(data.length() - h);

此外,如果您确实需要动态分配对象,则应该使用智能指针(std::unique_ptrstd::shared_ptr),而不是原始指针。

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11925353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档