首页 > 解决方案 > 测试(2922,0x10f07ce00)malloc:*** 对象 0x7fb438c05a70 错误:未分配指针被释放

问题描述

这是我写的 C++ 程序,这个程序创建了一个 String 类,其中包含两个属性str(用于存储字符串)和len(用于存储字符串的长度):

#include<iostream>
#include<string.h>

using namespace std;

class String {
    char *str;
    int len;

public:
    String();
    String(const char*);
    String(const String&);
    ~String();
    friend String operator + (const String&, const String&);
    friend bool operator <= (const String&, const String&);
    friend ostream& operator << (ostream&, const String&);
};

String::String(void)
{
    // Default constructor of the class String
    str=NULL;
    len=0;
}

String::String(const char* cp)
{
    // Parametrized constructor of the class String
    len=strlen(cp);
    str=new char[len+1];
    strcpy(str, cp);
}

String::String(const String& str1)
{   
    // Copy constructor of the class String
    len=str1.len;
    str=new char[len+1];
    strcpy(str, str1.str);
}

String::~String(void)
{   
    // Destructor of the class String to
    // free the heap memory allocated using new operator
    delete[] str;
}

String operator + (const String& str1, const String& str2)
{
    // Overload + operator to concatenate two strings and
    // return the object of class String containing the cocatanated string
    String str3;
    str3.len=str1.len+str2.len;
    str3.str=new char[str3.len+1];
    strcpy(str3.str, str1.str);
    strcat(str3.str, str2.str);

    return str3;
}

bool operator <= (const String& str1, const String& str2)
{   
    // Overload <= operator to compare two objects of class String
    if(str1.len<=str2.len)
        return true;
    else
        return false;
}

ostream& operator << (ostream& dout, const String& str1)
{
    // Overload << operator to print the string using object name of class String
    dout<<str1.str;
    return dout;
}

int main()
{
    String s1="New";
    String s2="York";
    char capital[]="Delhi";
    String s3=capital;
    
    String string1, string2, string3;

    string1=s1;
    string2=s2;
    string3=s1+s3;

    cout<<string1<<endl;
    cout<<string2<<endl;
    cout<<string3<<endl;

    return 0;
}

使用 g++ 运行此程序后,我收到以下错误消息:

New
York
NewDelhi
test(2922,0x10f07ce00) malloc: *** error for object 0x7fb438c05a70: pointer being freed was not allocated
test(2922,0x10f07ce00) malloc: *** set a breakpoint in malloc_error_break to debug
fish: Job 1, './test' terminated by signal SIGABRT (Abort)

看起来一些堆内存被释放了两次,或者一个未分配的内存被释放了。我无法弄清楚程序哪里出错了。

标签: c++memory-managementheap-memory

解决方案


推荐阅读