【发布时间】:2012-02-10 22:13:05
【问题描述】:
我有以下课程:
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 模式到处都是,以前从未有过这样的问题。
【问题讨论】:
-
不一定是您的问题,但您需要添加复制构造函数。当前的复制构造函数最终会复制指针 - 因此首先调用的析构函数将删除其他对象的内存。
-
@Anycorn 在这种情况下他需要一个赋值运算符
-
对 - 错过了那部分 - 它只是真正突出的东西
标签: c++ class constructor destructor