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

标签 c++ memory memory-leaks

我有以下代码,我不确定为什么当它命中 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/

相关文章:

memory-leaks - 如何从 lwIP 的 mem_malloc 获取可用内存?

c++ - 在OpenGL中为地形生成平滑法线

c++ - 如何覆盖 C++ 类中的 bool 运算符?

java - 与 Java 堆大小作斗争,本地 Java 和 Java web 启动之间的巨大差异

php高内存问题

winapi - GlobalFree() 导致用户断点...内存块是固定的,未锁定,单个模块,无 DLL

memory-leaks - 这个vala代码是内存泄漏吗?

c++ - 最佳 C++ 代码格式化程序/美化程序

c++ - 如何获取ipmi fru原始数据?

linux - 如何获取Linux进程“使用”的内存?