不使用复制构造函数时出现双重释放错误
Getting double free error when not using copy constructor
class String
{
private:
char *s;
int size;
public:
String(const char *str = NULL); // constructor
~String() { delete [] s; }// destructor
//String(const String&); // copy constructor --> i get double free error while running without this
void print() { cout << s << endl; } // Function to print string
void change(const char *); // Function to change
};
String::String(const char *str)
{
size = strlen(str);
s = new char[size+1];
strcpy(s, str);
}
void String::change(const char *str)
{
delete [] s;
size = strlen(str);
s = new char[size+1];
strcpy(s, str);
}
/*String::String(const String& old_str)
{
size = old_str.size;
s = new char[size+1];
strcpy(s, old_str.s);
}*/
int main()
{
String str1("Hello");
String str2 = str1;
str1.print(); // printed
str2.print();
str2.change("Helloworld");
str1.print(); // not printed
str2.print();// printed
return 0;
}
我收到双重释放错误,str1
的打印没有第二次打印(请参阅上面代码中的注释)...
是否因为当我在这里不使用复制构造函数时,使用赋值运算符而不是调用默认复制构造函数,并且 str2
和 str1
都指向相同的位置?
String str2 = str1;
调用 复制构造函数 ,而不是赋值运算符。
由于您不提供拷贝构造函数,编译器会自动提供一个。只需复制会员数据即可。
因此 str2
和 str1
将共享相同的字符缓冲区。轰!
class String
{
private:
char *s;
int size;
public:
String(const char *str = NULL); // constructor
~String() { delete [] s; }// destructor
//String(const String&); // copy constructor --> i get double free error while running without this
void print() { cout << s << endl; } // Function to print string
void change(const char *); // Function to change
};
String::String(const char *str)
{
size = strlen(str);
s = new char[size+1];
strcpy(s, str);
}
void String::change(const char *str)
{
delete [] s;
size = strlen(str);
s = new char[size+1];
strcpy(s, str);
}
/*String::String(const String& old_str)
{
size = old_str.size;
s = new char[size+1];
strcpy(s, old_str.s);
}*/
int main()
{
String str1("Hello");
String str2 = str1;
str1.print(); // printed
str2.print();
str2.change("Helloworld");
str1.print(); // not printed
str2.print();// printed
return 0;
}
我收到双重释放错误,str1
的打印没有第二次打印(请参阅上面代码中的注释)...
是否因为当我在这里不使用复制构造函数时,使用赋值运算符而不是调用默认复制构造函数,并且 str2
和 str1
都指向相同的位置?
String str2 = str1;
调用 复制构造函数 ,而不是赋值运算符。
由于您不提供拷贝构造函数,编译器会自动提供一个。只需复制会员数据即可。
因此 str2
和 str1
将共享相同的字符缓冲区。轰!