_BLOCK_TYPE_IS_VALID ошибка при повышении::scoped_array

После огромного количества копаний и поисков я нашел корень моей проблемы. По сути, этот код выполняется и в своем собственном проекте вызывает ту же ошибку. Я вижу, что не могу сбросить смарт-указатель на новую строку... но почему? И есть ли простой способ обойти это?

scoped_array<char> sptr;
char* nptr = "Hello";

sptr.reset("");
sptr.reset(nptr);

РЕДАКТИРОВАТЬ -

Я думаю, что я понял это. При сбросе смарт-указатель пытается удалить и очистить массив символов (""), который, поскольку новый оператор не использовался, не был размещен в куче (хм!!?!!?!???!?!). Следовательно, эта программа с треском сломается, когда попытается освободить память. Так что поправьте меня, если я ошибаюсь, но будет ли сама строка храниться в самом исполняемом потоке байтов программы? Если это так, просто для дальнейшего использования, есть ли способ форсировать выделение новой строки?

1 ответ

Решение

Вы правы в определении ошибки. scoped_array позвоню delete[] на объекте, который он держит; это, в конце концов, единственная цель его существования. Ты не можешь delete[] то, что не было new[]'dили вы получаете неопределенное поведение.

Тем не менее, вы должны просто использовать std::string если вы хотите динамическую строку. Все, что вы пытаетесь создать, чтобы scoped_array<char> вести себя как строка просто в конечном итоге как дрянная версия std::string, Тогда это так просто, как: std::string s; s = ""; s = "Hello",

Другие вопросы по тегам