아래 제공된 예제는 다소 나쁜 패턴이지만 나는이 질문을 호기심에서 물어보고 싶습니다. 이 상황에서메모리 블록을 수동으로 덮어 쓴 경우 구조체 배열을 삭제하는 방법
은 : packets
파괴시가 (메모리가 제로로 덮어되었다)을 MyStruct's
가상 테이블의 소멸자를 찾을 수 없기 때문에
int main (int argc, char **argv) {
struct MyStruct {
virtual ~MyStruct() = default;
int dummyField;
};
int numpack = 1000;
int memoryBlockSize = numpack*sizeof(MyStruct);
char* buf = new char[memoryBlockSize];
memset(buf, 0, memoryBlockSize);
{
MyStruct packets[numpack];
memcpy(&packets, buf, memoryBlockSize);
} // segmentation fault on scope exit
MyStruct* packets = new MyStruct[numpack];
memcpy(packets, buf, memoryBlockSize);
delete[] packets; // segmentation fault on delete attempt
delete[] buf;
return 0;
}
세그먼트 오류가 예상된다. 그런 경우 packets
이 가리키는 메모리 블록을 정상적으로 삭제할 수 있습니까?
삭제 기능에 (포인터 + 블록 크기)를 제공 할 가능성이 있습니까?
아니면 내가 같은 방식으로 할당 된 다른 메모리 블록에서 메모리를 복사하여 packets
가 가리키는 블록 복구를 시도 할 수 있습니다 (하지만 가상 테이블의 포인터는 메모리에서 다른 장소를 가리 킵니다) :
MyStruct* anotherPackets = new MyStruct[numpack];
memcpy(packets, anotherPackets, memoryBlockSize);
정의되지 않은 동작이 많이 발생합니다.이를 수정하는 표준 방법이 없습니다. – Barmar
'무료 (패킷)'시도 – user5821508
시도했습니다. 결과는 다음과 같습니다.''free() : invalid pointer '' – Ptaq666