Автоматически освобождать массив? - PullRequest
2 голосов
/ 26 июля 2011

Я ищу способ автоматического освобождения массива wchar_t s - что-то вроде автоматического указателя (я не очень знаком с std :: auto_ptr, но я думаю, что он не может быть использован для массивов).

Код, который у меня сейчас есть, таков:

/* volume is of type wstring,
 * hr is of type HRESULT, 
 * VSS_PWSZ equals wchar_t* 
 */

VSS_PWSZ pwszVolume = new wchar_t[volume.size() + 1];
std::copy(volume.begin(), volume.end(), &pwszVolume);
pwszVolume[volume.size()] = 0;

hr = pDiffMgmt->QueryDiffAreasOnVolume(pwszVolume, &pEnumMgmt);

delete[] pwszVolume;
pwszVolume = NULL;

Я действительно не понимаю, почему эта глупая функция не может взять const wchar_t*, иначе я мог бы просто передать volume.c_str().

Пока все хорошо, я думаю, что мой код решает эту проблему, но теперь управление памятью усложняется: мне пришлось бы дублировать код delete[] для учета исключений, которые могут быть сгенерированы (а я этого не делаю хочу поймать на этом этапе.)

Есть ли способ, которым я могу получить pwszVolume для автоматического освобождения при оставлении текущей области?

Ответы [ 5 ]

6 голосов
/ 26 июля 2011

Используйте std :: vector , это ваш основной массив C ++ (или std :: wstring, если вы хотите манипулировать им как строкой).

std::vector<wchar_t> pwszVolume(volume.begin(), volume.end());
pwszVolume.push_back(0);

hr = pDiffMgmt->QueryDiffAreasOnVolume(&pwszVolume[0], &pEnumMgmt);

Вопрос может быть. Что QueryDiffAreasOnVolume () делает с данными?
Может быть, вам не нужно копировать его.

4 голосов
/ 26 июля 2011

std::unique_ptr можно использовать с массивами следующим образом:

std::unique_ptr<wchar_t[]> pwszVolume(new wchar_t[volume.size() + 1]);

Другой вариант - std::array.

Но я согласен с Мартином ответьте , что вы должны просто использовать std::vector, если вы действительно не можете позволить себе иметь пару дополнительных указателей, которые содержит векторный класс.

1 голос
/ 26 июля 2011

Как уже говорили, std::vector является предпочтительным решением, безусловно.В противном случае (если, например, вы изначально получаете указатель от стороннего программного обеспечения, которое вы не можете изменить), есть boost::scoped_array или boost::shared_array.

0 голосов
/ 26 июля 2011

Если вам не нужны служебные данные от std :: vector, используйте boost :: array . Это ваш основной массив C ++ со статическим размером.

0 голосов
/ 26 июля 2011

Вы можете обернуть wchar_t * внутри класса, освободить память при destruct-or, и у вас есть объект, который будет автоматически освобожден при потере области видимости.

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