Не могу удалить указатель, сработала точка останова - PullRequest
0 голосов
/ 30 октября 2018

Я изучил C ++ в онлайн-курсе, но у меня проблема с оператором «delete» в Visual Studio. Когда удаление выполняется, он открывает файл delete_scalar.cpp и показывает:

ConsoleApplication.exe вызвал точку останова. исключение

Я уже перемещаю папку SymbolCache из temp, включая wntdll.pdb и т. Д.

#include "pch.h"
#include <iostream>
using namespace std;

int main()
{
int *pInt = new int;
*pInt = 3;
cout << *pInt << endl;
cout << pInt << endl;

delete[] pInt; //error -- UPDATED: still get error with `delete pInt;` 

return 0;
}

здесь информация о выводе,

«ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ ntdll.dll». Символы загружены. «ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ kernel32.dll». Символы загружены. «ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ KernelBase.dll». Символы загружены. «ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ msvcp140d.dll». Символы загружены. «ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ vcruntime140d.dll». Символы загружены. «ConsoleApplication11.exe» (Win32): загружен «C: \ Windows \ SysWOW64 \ ucrtbased.dll». Символы загружены. Поток 0x2fd0 вышел с кодом 0 (0x0). HEAP [ConsoleApplication11.exe]: неверный адрес, указанный для RtlValidateHeap (00930000, 009359E8) ConsoleApplication11.exe вызвал точку останова.

delete_scalar.cpp из самого визуала,

//
// delete_scalar.cpp
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the scalar operator delete.
//
#include <crtdbg.h>
#include <malloc.h>
#include <vcruntime_new.h>
#include <vcstartup_internal.h>

_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK); // the circle X symbol showed up there
    #else
    free(block);
    #endif
}

Я уже делаю точки останова, такие как включение и удаление, но точка останова все еще срабатывает на delete_scalar.cpp с отображением символа круга X.

1 Ответ

0 голосов
/ 30 октября 2018

Если вы запрашиваете память с помощью new, вам необходимо удалить ее с помощью delete.

Используйте delete [ ] только тогда, когда вы использовали new [ ]. Несовпадение двух приводит к неопределенному поведению.

...