업데이트 : (솔벤트) 업데이트 : 좋아요, 나는 완전 바보입니다! 내 메인 프로그램에서 "데이터로 처리"부분에서 포인터가 증가되어 결국 분명히 작동하지 않을 것입니다! D' oh! 다른 공유 라이브러리에 할당 된 포인터 삭제
그래서 나는이 유사한 기능 (슈퍼 단순화보기)가 공유 라이브러리를 컴파일하고,이 라이브러리는 mine- 그래서 데이터가 할당되는 방법을 알고있다 : 그것은 반환해야// inside library
void* getData(int size) { // with other parameters
UINT8* data = new UINT8[size]; // where typedef uint8_t UINT8; for gcc
// do a socket read, where data is the buffer
blockingRead (someSocket, data, propertySize);
return (void*) data;
}
void 포인터 (데이터가 struct 일 수 있으므로 struct에 그냥 캐스트 할 수 있음).
문제는 내 주 프로그램에서이 포인터를 사용하고 있는데, 끝나면 삭제하려고합니다. 내 메인 프로그램에서이 작업을 수행하는 경우 :
// inside library
void disposeData(void* data) { // call this from main program
delete[] (UINT8*) data; // cast it back to the original type of pointer
}
을하지만 난 여전히 같은 충돌을 얻을 :
// inside main program
char* data = (char*) Library::getData(5);
// do stuff with data
delete[] data; // crashes with:
// *** glibc detected *** core: free(): invalid pointer: 0x00002aaab007bca4 ***
나는 어쩌면 생각 나는 대신 공유 라이브러리에서 삭제해야합니다! 삭제를하지 않으면 모든 것이 잘 작동하지만 멋지게 메모리 누수가 발생하지 않습니다.
나는 아마 어딘가에 바보 같은 짓을하고있다. 내 방식으로 오류를 찾도록 도와주세요!
편집 : 의견에서 지적한대로 위의 코드가 작동하는 것 같습니다. 특히 코드에서 오류의 원인이 무엇인지 확인해야합니다.
문제가있는 최소한의 예를 만들어야한다고 생각합니다. 나는 g ++로 당신의 코드를 시험해 보았다. –
감사합니다 노아! 흠, 거기에 더있을 것 같아요 ... 조사 할게요 –
당신의 문제는'data stuff with data' 부분에있을 가능성이 높습니다. 당신은 어떻게 든'Library :: getData (5)'가 반환하는 것과 같은 포인터를 삭제하지 않을 것입니다 (아마 버퍼 오버런 때문이거나 어딘가에서'data'에 다른 것을 할당 할 것입니다) – nos