Void *指针问题

时间:2010-07-17 14:43:57

标签: c++ memory memory-management

对c ++来说很新,我对一段代码有一个相当(我认为)的愚蠢问题:

class DataStream
{
protected:
 DataStream(void) { };
public:
 DataStream(int Length); 
 ~DataStream(void);

...
 void* DataPtr;
 int Length;
};

我确实有一个与此类似的类,我想为DataPtr分配一个指向分配的数据的指针。 当我做的时候

DataStream::DataStream(int length)
{
char* arr = new char[length];
this->DataPtr = arr;
this->Length = length;
} 

我得到的只是破坏类(长度变量假设奇怪的值)并且dataptr与arr指针不同。 这是为什么? 我错过了什么?

编辑信息:

Windows平台, Visual Studio 2010, 实现就是这样(在构造函数中完成)。 includes类是一个简单的EMPTY类,只有一个构造函数,它返回DataStream类的构造函数。类名是ShaderFormat。 在主应用程序中,唯一的行是

ShaderFormat* sf = new ShaderFormat();
DataStream* ds = sf->Save();

我没有直接在主应用程序中引用DataStream,只有shaderformat类。 (这似乎是问题) 那是为什么?

3 个答案:

答案 0 :(得分:2)

在管理类中的动态资源时,请记住rule of three。你需要:

  • 复制构造函数以复制(或增加引用计数)资源,
  • 复制分配运算符 - 同样,
  • 析构函数如果不再引用则释放资源。

可以使用多种工具来简化此管理:

  • 作为类成员的普通std::vector<char>可以解决您的特定阵列问题 - 它为您管理内存并让您控制缓冲区的长度,并且 可完全复制。
  • boost::noncopyable私有继承禁用所有复制语义。这可能适用于不可共享的资源。
  • Boost Smart Pointers库提供了一组类,其中包含用于管理指针和数组的范围引用计数语义。

深入了解C ++开发,你会发现使用大胆的指针可以减少你的工作量,而使用微小的包装类和引用会更多。

答案 1 :(得分:1)

您是否可以尝试将您的示例缩小为表现出行为的完整而小的示例?我认为没有理由分配会影响对象的其他成员。

答案 2 :(得分:0)

如何将arr转换为void *以及何时需要将其转换为char *?