gpt4 book ai didi

c++ - 为什么这个析构函数在创建后立即被调用?

转载 作者:可可西里 更新时间:2023-11-01 18:09:27 26 4
gpt4 key购买 nike

我有以下类(class):

class FixedByteStream {
public:
FixedByteStream() : size(0), address(NULL), existing(false) {}
FixedByteStream(int length) : existing(false) {
size = length;
address = new char[length];
}
FixedByteStream(int length, char* addr) : existing(true) {
size = length;
address = addr;
}
FixedByteStream(string* str, bool includeNull = false) : existing(true) {
size = (*str).length();
address = const_cast<char*>((*str).c_str());
if (includeNull){
++size;
}
}
~FixedByteStream() {
if (existing == false) {
delete [] address;
}
address = NULL;
}
int getLength() {
return size;
}
char* getAddressAt(int index) {
return &(address[index]);
}


char& operator[] (const int index) {
return address[index];
}
operator char*() {
return address;
}

private:
bool existing;
int size;
char* address;
};

还有一个能够产生问题的非常简单的测试:

FixedByteStream received;
received = FixedByteStream(12);
received[0] = 't';

Valgrind 对无效写入发出警告,调试已显示原因。 FixedByteStream received; 调用不带参数的构造函数(这有点愚蠢,因为它不能任何事情)。 received = FixedByteStream(12); 使用整数参数调用构造函数...然后立即调用自身的析构函数,使对象无效。由于某种原因它仍然有效,但我宁愿它不要被置于这样一个会引发警告的奇怪困境中。

那么,为什么要在那里调用它呢?如果析构函数被称为first,我可以理解一些,以摆脱无用的临时对象(不是它需要的),但我实际上使用了那种 declare-now-assign-later 模式到处都是,以前从未遇到过这样的问题。

最佳答案

您缺少赋值运算符。记住 rule of three (或五个)。

问题大致是这样的:

T t; // default constructed t
t = T(2); // T(2) constructor with a single argument, assignment operator= called with this == &t

您没有提供赋值运算符,因此临时对象中的指针值被简单地复制到 t 中,然后指向的内存在临时对象的析构函数中被删除。

此外:如果构造的对象无效,则不要有默认构造函数。

关于c++ - 为什么这个析构函数在创建后立即被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872074/

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