Void * проблема с указателем - PullRequest
2 голосов
/ 17 июля 2010

Довольно плохо знаком с 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, Реализация именно такая (сделано в конструкторе).Включающий класс - это простой EMPTY-класс, имеющий только конструктор, который вызывает взамен конструктор класса DataStream.Имя класса - ShaderFormat.В основном приложении единственными строками являются

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

. Я не имел прямой ссылки на DataStream в основном приложении, только классы shaderformat.(это была проблема, кажется) Почему это?

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

При управлении такими динамическими ресурсами в классе помните правило из трех . Вам нужно:

  • конструктор копирования , чтобы сделать копию (или увеличить счетчик ссылок) ресурса,
  • оператор копирования копии - то же самое,
  • деструктор для освобождения ресурса, если на него больше нет ссылок.

Количество доступных инструментов для облегчения этого управления:

Углубившись в разработку C ++, вы обнаружите, что вы меньше работаете с жирными указателями и больше с крошечными классами-обертками и ссылками.

1 голос
/ 17 июля 2010

Не могли бы вы попытаться свести свой пример к полному, но маленькому, демонстрирующему поведение?Я не вижу причин, по которым назначение могло бы повлиять на других членов объекта.

0 голосов
/ 17 июля 2010

как насчет преобразования arr в void * и когда вам это нужно, приведение его к char *?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...