저는 원시 포인터가 "악의적 인"소리를 듣기 위해 잠시 동안 C++ 커뮤니티를 돌아 다니며 가능하면 피하는 것이 좋습니다. 원시 포인터를 통해 스마트 포인터를 사용하는 주된 이유 중 하나는 메모리 누수를 "방지"하는 것입니다. 그래서 내 질문은 : 똑똑한 포인터를 사용하는 경우에도 메모리 누수가 여전히 가능합니까? 그렇다면 어떻게 가능할까요?스마트 포인터를 사용하여 메모리 누수가 발생할 수 있음
답변
을 누설하지 않는 당신에게 달려?
예, 참고 문헌에주기가 생기지 않도록주의하십시오.
그렇다면 어떻게 가능합니까?
참조 계산 (예 : shared_ptr)에 기반한 스마트 포인터는 객체와 관련된 참조 횟수가 0으로 떨어지면 지적 된 객체를 삭제합니다. 그러나 참조 (A-> B-> A, 또는 좀 더 정교한 사이클)에 사이클이있는 경우 스마트 포인터가 "서로를 생생하게 유지"하기 때문에주기의 참조 카운트가 0으로 떨어지지 않습니다.
다음은 포인터로 shared_ptr을 사용하는 것 외에 메모리를 누출시키는 간단한 프로그램의 예입니다. 실행하면 생성자가 메시지를 인쇄하지만 소멸자는 절대 수행하지 않습니다.
#include <stdio.h>
#include <memory>
using namespace std;
class C
{
public:
C() {printf("Constructor for C: this=%p\n", this);}
~C() {printf("Destructor for C: this=%p\n", this);}
void setSharedPointer(shared_ptr<C> p) {pC = p;}
private:
shared_ptr<C> pC;
};
int main(int argc, char ** argv)
{
shared_ptr<C> pC(new C);
shared_ptr<C> pD(new C);
pC->setSharedPointer(pD);
pD->setSharedPointer(pC);
return 0;
}
'대부분의'스마트 포인터가 의미하는 바가 확실하지 않습니다. C++ 표준에는 두 개가 있고 (스마트 포인터가 아닌 약한 ptr이지만 스마트 포인터를 가져 오는 자리 표시 자), 그 중 하나는 참조 카운터를 사용하지만 다른 하나는 참조하지 않습니다. – SergeyA
고마워. 고마워. –
스마트 포인터에서 메모리를 해제하는 기능이 있습니다. 이 경우 메모리 관리를 중단하라는 스마트 포인터를 요구하고 있습니다. 이 메모리를 누수가 여전히 가능하며, 스마트 포인터를 사용하는 경우 그 후, 그것은 심지어 메모리
- 1. 메모리 누수가 발생할 수 있음
- 2. CanvasRenderer를 사용하여 메모리 누수가 발생할 수 있습니다.
- 3. Entity Framework에서 많은 메모리를 사용합니다 (메모리 누수가 발생할 수 있음)
- 4. AutomationElement 클래스를 사용하는 동안 메모리 누수가 발생할 수 있음
- 5. 일반 JSP 사이트에서 메모리 누수가 발생할 수 있음
- 6. 비트 맵을 생성 할 때 메모리 누수가 발생할 수 있음
- 7. UIWindow # addSubview로 메모리 누수가 발생할 수 있습니까?
- 8. 핸들러를 사용하여 메모리 누수가 발생할 가능성이 있습니까?
- 9. Zxing의 System.Drawing.Bitmap에서 메모리 누수가 발생할 수 있습니다.
- 10. 차트 툴킷에서 메모리 누수가 발생할 수 있습니다.
- 11. 왜이 프로그램은 메모리 누수가 발생할 수 있습니까?
- 12. org.hibernate.internal.SessionFactoryImpl로 인해 메모리 누수가 발생할 수 있습니다.
- 13. .NET의 스택에서 메모리 누수가 발생할 수 있습니까?
- 14. 파스칼에서 메모리 누수가 발생할 수 있습니까?
- 15. 예정된 미래에 메모리 누수가 발생할 수 있습니까?
- 16. Python이 설정에서 메모리 누수가 발생할 수 있습니까?
- 17. Heroku에서 메모리 누수가 발생할 수 있습니다.
- 18. 메모리 누수가 발생할 가능성이 있습니까?
- 19. 활성 모니터에서 QPixmap 누수가 발생할 수 있음 Mac OS X
- 20. GetHBITMAP() 및 MFC CStatic :: SetBitmap()을 사용하여 메모리 누수가 발생할 수 있음
- 21. HttpRequest로 인한 메모리 누수가 발생할 때까지
- 22. 이 C#에서 메모리 누수가 발생할 것입니다
- 23. 가상 소멸자없이 메모리 누수가 발생할 가능성이 있습니까?
- 24. 스마트 포인터를 사용하여 버퍼 관리
- 25. .NET Windows 서비스, 스레드 및 가비지 수집 (메모리 누수가 발생할 수 있음)
- 26. new []와 delete를 페어링하면 어떻게 메모리 누수가 발생할 수 있습니까?
- 27. 정적 ApplicationContext를 선언하면 메모리 누수가 발생할 수 있습니까? (Spring 3)
- 28. 새로운 Date() 케이스에서 node.js의 메모리 누수가 발생할 수 있습니까?
- 29. performSelector는 누수가 발생할 수 있습니다
- 30. 이와 같은 정적 작업을 사용하면 메모리 누수가 발생할 수 있습니까?
[**이 질문 **] (http://stackoverflow.com/questions/1826902/how-to -avoid-memory-leak-with-shared-ptr) 흥미 롭습니다. 아마 [** this one **] (http://stackoverflow.com/questions/67174/find-memory-leaks-caused-by-smart-pointers). 둘 다 당신의 일반적인 질문과 직접적으로 관련이 있습니다 (그리고 "스마트 포인터를 사용할 때이 사이트에서 여전히 메모리 유출이 가능합니까?"). – WhozCraig