Нашли новый адрес памяти? C ++

0

(Я проверил адрес, потому что я получал ошибки, и я узнал, что адрес был изменен, прежде чем он был удален, к моменту его удаления 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;
}
  • 4
    вы меняете указатель во время назначения titlePTR = L"MapleStory"; рассмотрите возможность использования strcpy (или аналогов wchar) здесь
  • 0
    "...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 ++"?
Показать ещё 4 комментария
Теги:
pointers
memory

1 ответ

2
Лучший ответ
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.

  • 0
    Спасибо чувак! Я знал, что это была та строка, но я просто не знал, мог ли я просто написать это внутри выделенного адреса. Я думаю, что char / wchar_t [] не работает как int. (Поскольку массивы char / wchar_t уже используют указатели / адреса для внутреннего использования. Но еще раз спасибо, люди всегда просто говорили, что я был неправ, полностью не объясняя мне, почему и как это было.
  • 0
    Нет проблем. Вы можете пометить этот ответ как ответ, который помог вам закрыть этот вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню