【发布时间】:2014-03-14 22:30:27
【问题描述】:
我有这个类定义:
class FlashStream
{
public:
explicit FlashStream(const char * url, vector<uint8> * headers, vector<uint8> * data, void * ndata, void * notifyData = NULL, uint32 lastModified = NULL);
~FlashStream();
private:
NPStream _stream;
// ...
}
及其实现:
FlashStream::FlashStream(const char * url, vector<uint8> * headers, vector<uint8> * data, void * ndata, void * notifyData, uint32 lastModified)
{
// ...
memset(&_stream, 0, sizeof(NPStream));
_stream.headers = new char[data->size()];
memcpy((void*)_stream.headers, &(*data)[0], data->size());
// ...
}
FlashStream::~FlashStream()
{
// ...
if(_stream.headers)
delete [] _stream.headers;
_stream.headers = NULL;
// ...
}
现在,当我运行这段代码时:
// ...
vector<FlashStream> _streams;
// ...
_streams.push_back(FlashStream(url, headers, data, _npp.ndata, notifyData, lastModified));
// ...
有时我在FlashStream 的析构函数中的delete [] _stream.headers; 有一个错误,当我将push_back() 调用到vector<FlashStream> _streams 时会调用它。
我读过this question on SO 和其他一些,但仍然不知道如何优雅有效地解决问题。可能问题出在复制构造函数中,但我不知道如何为NPStream.headers 和NPStream.url 分配内存?
【问题讨论】:
-
在将临时
FlashStream实例复制到向量后,可能会调用析构函数。我认为要正常工作,您还应该提供正确的(深度)复制/移动行为。 -
非常感谢,但我不知道如何在为
NPStream.headers和NPStream.url分配内存的情况下制作FlashStream 复制构造函数? -
你为什么要为这些班级成员使用指针?
-
我不明白这个问题。
-
我看到它是一个 C-API 结构。只需创建将指针初始化为类的普通字段所需的所有内容(如
std::string、std::vector<uint8_t>等),并使用它们的数据地址初始化NPStream成员中的指针。
标签: c++ vector destructor