gpt4 book ai didi

c++ - 使用删除时堆损坏

转载 作者:行者123 更新时间:2023-12-02 09:50:56 25 4
gpt4 key购买 nike

我有一个MultiString类,其中包含一些方法。

我正在努力在析构函数中删除我的字符串数组,但发生堆损坏。

这是我的类(class)(某些方法被删减了)

class MultiString {
public:
//constructor destructor
MultiString(int);
~MultiString();

//methods
void Setat(int nindex, const char* str);

//attributes

char** buf;//pointer to vector
int str_nmb;//strings number
};

构造函数代码:

MultiString::MultiString(int number)
{
str_nmb = number;
buf = new char* [number];
for (int i = 0; i < number; i++) buf[i] = NULL;
}

Setat代码(用于在数组中设置字符串):

void MultiString::Setat(int nindex, const char* str)
{
if (nindex<0 || nindex>str_nmb || str == NULL) {
std::cout << "gg";
return;
}
char* tmp = new char[strlen(str)+1];
if (tmp == NULL) return;
if (buf[nindex] != NULL) delete buf[nindex]; //here delete works fine
buf[nindex] = tmp;
strcpy_s(buf[nindex], strlen(buf[nindex]), str);
std::cout << buf[nindex]<< std::endl;
}

析构函数代码:

MultiString::~MultiString()
{
for (int i = 0; i < str_nmb; i++)
delete buf[i]; // heap corruption here
delete buf;
}

还有我的 main():

int main()
{
MultiString* ms = new MultiString(3);
ms->etat(0, "qwerty");
ms->Setat(1, "asdfgh");
ms->Setat(2, "zxcvbn");
delete ms;
return 0;
}

最佳答案

char* tmp = new char[strlen(str)+1];
// ...
buf[nindex] = tmp;
strcpy_s(buf[nindex], strlen(buf[nindex]), str);
buf[nindex]指向刚分配的但 未初始化的内存区域。对此调用 strlen是未定义的行为,很可能会破坏您的堆。您可能想改为调用 strlen(str)

除此之外,您还会犯其他一些错误:
  • 打破了0/3/5的规则。
  • delete其中需要delete[]
  • 错误的边界检查(nindex>str_nmb)
  • Multistring(-5)呢?
  • if (tmp == NULL) return; ...不,您不应该忽略错误。抛出异常或其他东西。

  • 还..为什么要 strcpy_s?使用 std::strncpy ...至少保证可以使用!确保复制的C字符串以null结尾!

    关于c++ - 使用删除时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59462504/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com