이런 오류가 wchar_t의 동적배열(문자열)을 인자로하는 delete[]함수에서 발생하는데요
1. 동적할당을 해제할 메모리의 주소에 실제로 값이 있고, 쓰고 있는 주소 입니다 printf 하면 값이 정상적으로 나와요
심지어 문제가 되는 delete[] 바로 직전에 확인해도 값이 정상적으로 나옵니다
2. 메모리의 주소는 다를 수 있지만, 같은 값을 가지는 완전히 똑같은(아예 같은 위치의 코드에요) 실행이 한번은 정상적으로 나타납니다
심지어 이후에 다른 함수에서 delete[]를 사용해봐도 정상적으로 실행되요
그런데 특정 시점에 delete[]만 하면 저 오류가 나타납니다 대체 원인이 뭘까요?
+)
//관련 없는 if문 생략
for (int i = 0; (unsigned)i < (unsigned)a; i++)
{
clear_str[i] = str[clear_range + i];
}
clear_str[a] = L'\0';
delete[](str)// 여기서 오류가 납니다
//new의 크기를 다시 늘리거나 줄이기 위해서 아래와 같은 코드를 다른 함수에서 실행하는 경우도 있어요
//이런식으로요 문제가 되는 배열인 str은 클래스 내에 있어요
free(this->배열명);
this->배열명 = new wchar_t [필요한 크기];
//함수의 인자값으로 this->배열명 을 &타입으로 받아와서 함수의 파라미터를 this->배열명 대신 쓰기도 해요
코드좀 봅시다
코드가 좀 길어서 근처 부분만 최대한 줄여 볼게요
내 경험상으론 스코프를 벗어나서 소멸된 인스턴스를 한번 더 제거하려 했거나, 어디선가 레퍼런스가 복사가 되서 여러번 제거하려 했을 때가 있긴 했음. 중단점 찍어서 직접 확인해보려고 노력해봐.
레퍼런스가 복사 되서 여러번 제거 하려 한게 제 경우 같은데 혹시 어떻게 해결하셨나요?
다시 확인해보니까 아니네요.. 읽어주셔서 감사합니다
도대체 포인터에 대한 레퍼런스는 왜 쓰는 거임 - dc App
함수에서 실행해야 하는 기능이 있어서 어쩔 수 없어요
delete하면 delete한 포인터를 nullptr로 바꾸고 nullptr 아닐 때만 delete하게 해봐 - dc App
저거 보통 할당한 배열보다 더 큰 값을 덮어씌워서 힙 오버플로우가 난거임, str에 길이보다 더 크게 쓰는지 확인하셈
둘다 확인해 볼게요 감사합니다