gpt4 book ai didi

c++ - 正常 block 后检测到堆损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:01 28 4
gpt4 key购买 nike

我有以下代码,我不确定为什么当它命中 Myclass 的析构函数时我会收到堆损坏检测错误。我相信我正在正确地释放内存??

#include <iostream>
#include <vector>
using namespace std;

class MyClass{
private:
char* mp_str;
public:
MyClass():mp_str(NULL){}
~MyClass(){
delete [] mp_str;
}

void setString(const char* str);
void printString();
};

int main(){
MyClass* a = new MyClass();
std::vector<MyClass> myVector;

myVector.push_back(*a);

a->setString("Hello World");
myVector[0].setString("Goodbye world");

a->printString();
myVector[0].printString();

return 1;
}

void MyClass::setString(const char* const str){
if(!str)
return;

size_t len = strlen(str);

if(!this->mp_str){
this->mp_str = new char[len];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}

void MyClass::printString(){
if(this->mp_str)
cout << mp_str;
else
cout << "No string found";
}

编辑:(固定代码)

void MyClass::setString(const char* const str){
if(!str)
return;

size_t len = strlen(str);

if(!this->mp_str){
this->mp_str = new char[len+1];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}

在main()中,我还添加了

delete a;

在调用 return 1 之前;

最佳答案

你需要分配字符串的长度+1,来占null。你的内存设置正确。

if(!this->mp_str){
this->mp_str = new char[len+1];
memset(mp_str, 0, len+1);
}

关于c++ - 正常 block 后检测到堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11676259/

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