shared_ptr <void>t (новый символ [номер]) означает утечку памяти? - PullRequest
1 голос
/ 24 октября 2011
shared_ptr<void> t(new char[num])

означает утечку памяти?

Если это так, какова правильная практика в этом случае.

мне использовать взамен shared_array <>?

Я редактирую байты, обозначенные 't', вручную для последующей передачи в потоке TCP.

Ответы [ 5 ]

3 голосов
/ 24 октября 2011

означает утечку памяти?

Нет, это означает неопределенное поведение. (Это может иметь любой признак, включая утечку памяти.) Вызов delete должен соответствовать вызову new. Твой нет. Вы выделяете new[], но уничтожаете delete.

Если это так, какова правильная практика в этом случае. Должен ли я использовать shared_array <> вместо?

Есть два простых варианта. Вы можете использовать shared_array:

shared_array<char> t(new char[num])
t[7] = 42;

Или вы можете использовать от shared_ptr до std::vector:

shared_ptr<std::vector<char> > t(new std::vector<char>(num))
(*t)[7] = 42;

<ч /> EDIT : Спасибо @Dennis Zickefoose за мягкое указание на ошибку в моем мышлении. Части моего ответа переписаны.

3 голосов
/ 24 октября 2011

Как я вижу, void, о котором вы упомянули в вопросе Q, является опечаткой, поскольку вызов по удалению на void * гарантирует стандартное неопределенное поведение.

Для другого типа данных,

Вам нужно будет указать свой deletor для shared_ptr, чтобы вы могли звонить delete [].

Например:

Например:

template<typename T>
struct Customdeleter
{
   void operator()(T* p)
   {
      delete [] p;
   }
};

И вызывать как:

shared_ptr<char> sp(new char[num], Customdeleter<char>());

EDIT:
Поскольку вы пояснили, что в комментариях используется Boost, а не TR1 (AFAIK TR1 не имеет shared_array)

Вы можете использовать shared_array:

shared_array<char> sp(new char[num])
1 голос
/ 24 октября 2011

Я думаю, что вижу, откуда вы пришли - вам нужны void * указатели, чтобы вы позже могли привести их к финальному типу, который вы сериализуете. Но, как отмечали другие, вы не можете удалить указатель void*, равно как и код для shared_ptr.

.

Поскольку вы выделяете массив char, это должен быть тип используемого вами умного указателя:

shared_array<char> t(new char[num]);

Приведение необработанного указателя на символ другого типа не должно быть более сложной задачей, чем приведение указателя void*.

0 голосов
/ 24 октября 2011

Я не знаю, имеет ли C ++ 11 shared_array, , но Boost имеет - вы должны использовать его вместо этого.

0 голосов
/ 24 октября 2011

Вы звоните delete на void*, что является неопределенным поведением.

причина, по которой я использую void *, заключается в том, что я выделяю 'num' байтов для храненияразличные типы переменных, такие как первые 4 байта, представляют собой двойные, следующие 2 байта короткие.

Затем используйте структуру или объединение.

...