아래 프로그램을 고려하십시오. 복잡한 경우에서 단순화되었습니다. Obj 클래스에서 가상 소멸자를 제거하지 않으면 이전에 할당 된 메모리를 삭제할 수 없습니다. 가상 소멸자가있는 경우에만 프로그램의 출력에서 두 주소가 다른 이유를 이해할 수 없습니다. 가상 소멸자가 존재할 때 게재 위치 new []의 사용에있어 잘못된 점은 무엇입니까? do
// GCC 4.4
#include <iostream>
using namespace std;
class Arena {
public:
void* alloc(size_t s) {
char* p = new char[s];
cout << "Allocated memory address starts at: " << (void*)p << '\n';
return p;
}
void free(void* p) {
cout << "The memory to be deallocated starts at: " << p << '\n';
delete [] static_cast<char*> (p); // the program fails here
}
};
struct Obj {
void* operator new[](size_t s, Arena& a) {
return a.alloc(s);
}
virtual ~Obj() {} // if I remove this everything works as expected
void destroy(size_t n, Arena* a) {
for (size_t i = 0; i < n; i++)
this[n - i - 1].~Obj();
if (a)
a->free(this);
}
};
int main(int argc, char** argv) {
Arena a;
Obj* p = new(a) Obj[5]();
p->destroy(5, &a);
return 0;
}
이
내 구현 프로그램의 출력 :에서할당 된 메모리 어드레스는 시작 : 0x8895008 메모리는에서 시작을 해제 할 : 0x889500c
실행 실패 (종료 값 1)
어떤 프로그램이 필요한지 묻지 마십시오. 영형. 내가 말했듯이, Arena가 다양한 메모리 유형을위한 인터페이스 인보다 복잡한 경우에서부터옵니다. 이 예제에서 메모리는 힙에서 할당되고 할당이 해제됩니다.
참고 * 일치하는 위치 배열이 새로운 표현에 예외를 throw하는 경우 삭제해야합니다. –