微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++ 中使用循环分配内存

如何解决在 C++ 中使用循环分配内存

我有一个用于字符数组的 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 个指向同一地址的指针。 有没有办法通过正确的内存分配将这些数组推回循环中?

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

解决方法

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

你的意思是

list.push_back(x);

添加新分配内存的地址?当然,这需要您更改 list 的类型 char * 的集合。


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


最后我想提一下,您可以避免讨厌的手动内存管理,只需使用 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);
}
,

好的。我找到了一个非常简单的解决方案:

char** x = new char*[n];
SList sl;
for (unsigned int i = 0; i < n; i++) {

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

有 N 个地址来存储指向数组的指针。我可以将他们的地址添加到我的列表对象中

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。