gpt4 book ai didi

c++ - 堆和类析构函数

转载 作者:行者123 更新时间:2023-11-27 23:17:02 25 4
gpt4 key购买 nike

我的代码有问题。我收到 BLOCK_TYPE_IS_VALID 错误...我知道新建和删除有问题,但我找不到它。我有一个具有这些功能的 myString 类:

    //constructors and destructors
myString::myString() {
this->string_ = NULL;
this->length = 0;

cout << "created " << "NULL" << endl;
}

myString::myString(char a[]) {
int i;
for (i=0; a[i]!=NULL; i++);
this->length = i;

int j=0;
while(pow(2,j)<i)
j++;

this->string_ = new char [(int)pow(2,j)];
for (int i=0; i<this->length; i++)
this->string_[i] = a[i];

cout << "created " << this->string_ << endl;
}

myString::~myString() {
cout << "deleteing " << this->string_ << endl;
if (this->string_ != NULL)
delete [] this->string_;
}

当我运行它时

myString a("aaa");
myString b("bbbb");
myString c;
c = a + b;
cout << c.get_lenght() << endl;
cout << c.get_string() << endl;

我在“c = a+b”行收到错误,然后程序停止。

最佳答案

你需要定义一个copy constructorassignment operator为你的类(class)。

myString::myString( const myString& );
myString& operator=( const myString& );

否则,您将违反 rule of three .

这段代码...

c = a + b;

可能会产生一个临时的 myString 保存值 a + b

默认生成的复制和赋值实现将给 c 临时文件具有的相同 string_ 指针

当其中一个字符串的析构函数运行时,另一个字符串将有一个悬空指针。

巧合的是,这段代码:

if (this->string_ != NULL)
delete [] this->string_;

永远不会采取与简单不同的方式:

delete [] this->string_;

关于c++ - 堆和类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15748370/

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