首页 > 解决方案 > 在 C++ 中使用循环进行内存分配

问题描述

我有一个用于 char 数组的 List 类。我想将N个数组从'a'推回'a..a'。

char* x;
SList list;
for (unsigned int i = 1; i < n+1; i++) {
    x = new char[i+1];
    for (unsigned int j = 0; j < i; j++) {
        x[j] = 'a';
    }
    x[i] = '\0';
    list.push_back(&x);
}

但每次,x 都有相同的地址。结果,我的 List 对象包含 N 个指向同一地址的指针。有没有办法通过正确的内存分配循环推回这些数组?

在询问之前发现了这个问题,但它并没有为我的问题提供一个很酷的解决方案。

标签: c++pointersmemory-management

解决方案


在循环的每次迭代中,x = new char[i+1];都会返回一个不同的地址,该地址存储在x. 因此,每次迭代中的值都会发生x变化,但地址x不会。

你的意思

list.push_back(x);

添加新分配内存的地址?当然,这需要您list更改char *.


必须提到的是,超出范围&x后取消引用将导致未定义的行为,因为不再存在。你用悬空指针填充。xxlist


最后我想提一下,您可以避免讨厌的手动内存管理,而只需使用std::vector<std::string>.

std::vector<std::string> list;

for (unsigned int i = 1; i < n+1; i++) {
    std::string newString(i, 'a'); // string with i times 'a'

    list.push_back(newString);
}

推荐阅读