_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"
,