gpt4 book ai didi

发生 C++ 堆损坏检测错误

转载 作者:行者123 更新时间:2023-12-01 14:47:59 25 4
gpt4 key购买 nike

当我尝试操作我的代码时,除了弹出调试错误外,它执行得很好。错误信息在这里。

enter image description here

我的完整代码在这里。

#include <iostream>
using namespace std;

class String {
public :
String() {
strData = NULL;
len = 0;
cout << "constructor executed !" << endl;
}

String(const char *str){
len = strlen(str);
strData = new char[len+1];
strcpy_s(strData, sizeof(str), str);

cout << sizeof(str) << endl;
cout << sizeof(len) << endl;
cout << sizeof(strData) << endl;
cout << strData << endl;
}
~String() {
delete[] strData; //Fails here!
}
char* GetStrData() const{
return strData;
}
int GetLen() const {
return len;
}
private :
char* strData;
int len;
};

int main() {
String str;
str = String("Hi");
}

结果就在这里

enter image description here

我推测这条消息是因为 strData 的大小,但我不知道确切。

我需要你们的帮助。谢谢。

最佳答案

这一行:
str = String("Hi");
是(非常粗略地)相当于:

String tmp("hi")
str.strData = tmp.strData;
str.len = tmp.len;

所以当两个 tmpstr被删除,你最终调用 delete两次在同一个地址。

你需要写一个自定义 operator=()您的 String 中的方法类来处理。

一旦你打开了那个潘多拉魔盒,你就应该越过你的 T 并正确地打点你的 Is。这被称为 0/3/5 规则。见 this详细问题:

关于发生 C++ 堆损坏检测错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61538158/

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