program story

스택에 할당 된 변수에 대한 삭제 호출

inputbox 2021. 1. 9. 09:52
반응형

스택에 할당 된 변수에 대한 삭제 호출


프로그래밍 스타일과 디자인을 무시하고 스택에 할당 된 변수에 대해 delete를 호출하는 것이 "안전"합니까?

예를 들면 :

   int nAmount;
   delete &nAmount;

또는

class sample
{
public:
    sample();
    ~sample() { delete &nAmount;}
    int nAmount;
}

아니요 , delete스택 할당 변수 를 호출 하는 것은 안전하지 않습니다 . delete에서 만든 항목 만 호출해야합니다 new.

  • malloc또는 각각에 대해 calloc정확히 하나가 있어야합니다 free.
  • 각각에 대해 new정확히 하나가 있어야합니다 delete.
  • 각각에 대해 new[]정확히 하나가 있어야합니다 delete[].
  • 각 스택 할당에 대해 명시적인 해제 또는 삭제가 없어야합니다. 소멸자는 해당되는 경우 자동으로 호출됩니다.

일반적으로, 예를 들어, 더, 혼합하지 이러한 일치하지 수 free-ing 또는 delete[]-ing new개체를. 그렇게하면 정의되지 않은 동작이 발생합니다.


글쎄, 해보자.

jeremy@jeremy-desktop:~$ echo 'main() { int a; delete &a; }' > test.cpp
jeremy@jeremy-desktop:~$ g++ -o test test.cpp
jeremy@jeremy-desktop:~$ ./test
Segmentation fault

그래서 분명히 전혀 안전하지 않습니다.


new (또는 해당 문제에 대해 malloc)를 사용하여 메모리 블록을 할당 할 때 할당 된 실제 메모리 블록이 요청한 것보다 더 커진다는 점을 명심하십시오. 메모리 블록은 또한 일부 부기 정보를 포함하므로 블록을 해제 할 때 쉽게 사용 가능한 풀에 다시 넣고 인접한 사용 가능한 블록과 통합 될 수 있습니다.

새 것에서받지 못한 메모리를 해제하려고하면 해당 부기 정보는 존재하지 않지만 시스템은있는 그대로 작동하고 결과는 예측할 수 없게됩니다 (일반적으로 나쁨).


예, 정의되지 않은 동작입니다. delete에서 오지 않은 new것은 UB로 전달하는 것입니다 .

C ++ 표준, 섹션 3.7.3.2.3 : 표준 라이브러리에서 제공되는 할당 해제 함수 중 하나에 제공된 첫 번째 인수의 값은 null포인터 값일 수 있습니다 . 그렇다면 할당 해제 함수가 표준 라이브러리에 제공된 함수이면 할당 해제 함수에 대한 호출이 효과가 없습니다. 그렇지 않으면 operator delete(void*)표준 라이브러리에 제공된 값은 operator new(std::size_t)또는 operator new(std::size_t, const std::nothrow_t&)표준 라이브러리 의 이전 호출에 의해 반환 된 값 중 하나가 됩니다.

정의되지 않은 행동의 결과는 명확하지 않습니다. "아무것도 일어나지 않음"은 다른 어떤 것만 큼 유효한 결과입니다. 그러나 일반적으로 "바로 아무 일도 일어나지 않음"입니다. 유효하지 않은 메모리 블록을 할당 해제하면 할당 자에 대한 후속 호출에서 심각한 결과가 발생할 수 있습니다.


Windows에서 g ++ 4.4로 약간 재생 한 후 매우 흥미로운 결과를 얻었습니다.

  1. 스택 변수에서 delete를 호출하는 것은 아무것도하지 않는 것 같습니다. 오류는 발생하지 않지만 삭제 후 문제없이 변수에 액세스 할 수 있습니다.

  2. 메서드가있는 클래스가있는 delete this경우 힙에 할당 된 경우 객체 성공적으로 삭제하지만 스택에 할당 된 경우에는 객체를 삭제하지 않습니다 (스택에있는 경우 아무 일도 발생하지 않음).


아무도 무슨 일이 일어나는지 알 수 없습니다. 이것은 정의되지 않은 동작을 호출하므로 말 그대로 모든 일이 발생할 수 있습니다. 이러지마


아니요, new를 사용하여 할당 된 메모리는 delete 연산자를 사용하여 삭제하고 malloc을 사용하여 할당 한 메모리는 free를 사용하여 삭제해야합니다. 그리고 스택에 할당 된 변수를 할당 해제 할 필요가 없습니다.


An angel loses its wings... You can only call delete on a pointer allocated with new, otherwise you get undefined behavior.


here the memory is allocated using stack so no need to delete it exernally but if you have allcoted dynamically

like int *a=new int()

then you have to do delete a and not delete &a(a itself is a pointer), because the memory is allocated from free store.


You already answered the question yourself. delete must only be used for pointers optained through new. Doing anything else is plain and simple undefined behaviour.

Therefore there is really no saying what happens, anything from the code working fine through crashing to erasing your harddrive is a valid outcome of doing this. So please never do this.


It's UB because you must not call delete on an item that has not been dynamically allocated with new. It's that simple.

ReferenceURL : https://stackoverflow.com/questions/441831/calling-delete-on-variable-allocated-on-the-stack

반응형