(Я проверил адрес, потому что я получал ошибки, и я узнал, что адрес был изменен, прежде чем он был удален, к моменту его удаления titlePTR
уже изменил свой адрес, и он дает мне сообщение об ошибке " BLOCK TYPE IS VALID
" Я слышал, что это когда вы пытаетесь удалить указатель, который не был сделан новым (так что это заставило меня задуматься над адресом)
Btw Я знаю, что мне не нужно создавать динамический массив, но я читаю книгу, и он говорит, чтобы практиковать экономию памяти в те моменты, когда вашей программе не нужно запускать код. Я отправил на несколько других мест, и люди всегда натыкаются на "Не используйте новый бла-бла-бла",
Вот что говорит, когда он titlePTR
удалить titlePTR
или bodyPTR
: http://postimg.org/image/gt0f8kufn/
if (test == "MapleStory")
{
wchar_t *titlePTR = new wchar_t[30]; <-- Example Address: 051
cout << titlePTR;
wchar_t *bodyPTR = new wchar_t[20];
titlePTR = L"MapleStory";
bodyPTR = L"Launching MapleStory...";
MessageBox(NULL, bodyPTR, titlePTR, MB_OK | MB_ICONINFORMATION);
ShellExecute(NULL, L"open", L"GameLauncher.exe", NULL, L"C:\\Nexon\\MapleStory", 1);
cout << endl << titlePTR; <-- Example Address: 0601
delete[] titlePTR;
delete[] bodyPTR;
}
wchar_t *titlePTR = new wchar_t[30]; // (1)
titlePTR = L"MapleStory"; // (2)
delete[] titlePTR; // (3)
Это выделяет память и сохраняет адрес памяти в переменной (1). Затем вы переписываете его новым адресом (2). А затем вы удаляете новый адрес (3) вместо выделенной памяти. Поэтому ваша проблема заключается в том, что назначение на шаге (2) не использует буфер, который вы подготовили, но создает новый буфер.
Чтобы исправить это, просто выполните:
const wchar_t *titlePTR = L"MapleStory";
И не удаляйте конечно, так как вы не выделяли какую-либо память, используя new
.
titlePTR = L"MapleStory";
рассмотрите возможность использования strcpy (или аналогов wchar) здесь"...but I am reading a book and it is saying to practice saving memory for times where your program doesn't need to run the code."
название книги "программирование на C ++"?