开发者

Void* pointer problem

Pretty new to c++, i have a rather (i think) stupid question开发者_JAVA百科 about a piece of code :

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

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

I do have a class similiar to this and i want to assign to DataPtr a pointer to some data allocated. When i do

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

All i get is corrupting the class (the length variable assume strange values) and the dataptr is not the same as the arr pointer. Why is that? What am i missing?

EDIT for information :

Windows Platform, Visual Studio 2010, The implementation is just that (done in the constructor). The including class is a simple EMPTY class with only a constructor that calls in return the constructor of the DataStream class. The class name is ShaderFormat. In the main app the only lines are

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

I was not directly referencing DataStream in the main app, only the shaderformat classes. (that was the problem it seems) Why is that?


When managing dynamic resources like that in a class, remember the rule of three. You need:

  • copy constructor to make a copy (or increment a reference count) of the resource,
  • copy assignment operator - same,
  • destructor to release the resource if not referenced anymore.

Number of tools is available to ease this management:

  • Plain std::vector<char> as member of your class can probably solve your particular array problem - it manages memory for you and gives you control over length of the buffer, and it is fully copyable.
  • Privately inheriting from boost::noncopyable disables all copy semantics. This might be suitable for non-sharable resources.
  • Boost Smart Pointers library provides set of classes with scoped and reference-counted semantics for managing pointers and arrays.

Getting deeper into C++ development you will find that you work less with bold pointers and more with tiny wrapper classes and references.


Could you try to shrink your example to a complete yet small one exhibiting the behavior? I see no reason that assignment would affect other members of the object .


what about casting arr to void* and when you need it casting it to char* ?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜