2011-08-25 6 views
4
IFSUPCUTILSize* size = NULL; 
CoCreateInstance(CLSID_UTILSize, NULL, CLSCTX_INPROC_SERVER, IID_IFSUPCUTILSize, reinterpret_cast<void**>(&size)); 

if (size != NULL){ 
size->Release(); 
size = NULL; 
} 
delete size; 

위의 코드에서 "크기 삭제"가 필요합니까? "크기 삭제"를 포함하면 새로 사용하지 않았기 때문에 메모리 누수가 발생합니까? 또는 CoCreateInsatnce에 대한 호출 내부에 New가 있습니다. 나는 이것을 VC++ 6으로 구현했다.메모리 누출 - 삭제

+2

Visual Studio의 최신 버전으로 업그레이드 할 수 있습니다. – GManNickG

답변

9

COM 인터페이스는 참조 카운트입니다. CoCreateInstance()은 참조 카운트가 이미 증가 된 COM 개체에 대한 인터페이스 포인터를 반환합니다. Release()을 호출하면 참조 횟수가 감소합니다. 참조 횟수가 0이되면 COM 개체가 자동으로 해제됩니다. COM 인터페이스 포인터에 delete으로 전화하지 마십시오! 항상 Release() 만 사용하십시오.

+0

감사합니다. 나에게 좋은 교육. OP – dysonfree

4

C++ 관점에서, 당신이하고있는 일은 훌륭하다. null 포인터에서 delete를 호출하면 아무 작업도 수행되지 않습니다. 그러나 불필요합니다.

VC++ 6의 관점에서 보면 악의적으로 비준수라고 말할 수는 없습니다. 나는 그것이 왜 문제가 될지 상상할 수 없다. 그러나 다시, 그것은 확실히 불필요합니다.

확실히 NULL로 설정되기 전에이 포인터에서 delete를 호출하지 마십시오. new로 할당하지 않았으므로 삭제를 호출하지 마십시오. 여기서 자원 관리는 COM 기능에 의해 처리됩니다.

-1

size-> Release()가 OS 리소스 (파일 핸들 등)를 공개한다고 가정합니다. 그러므로 size를 null로 설정하기 직전에 삭제 크기를 넣으십시오.

+3

그는 new로 할당하지 않았으므로 삭제하지 말아야합니다. –

+0

코드를 상속 받았습니다. 나는 나머지 코드를 점검한다. 포인터는 해제되고 다음 줄에서 null로 설정됩니다. 나는 무지에서 자신을 지워 버렸다. 나는 호환 컴파일러에 해가 없다고 생각한다. 그러나 미시시피, 나는 그것을 제거하는 것이 좋다. 나는 새로운 것을 가지고 있지 않으면 삭제할 필요가 없다는 것에 동의한다. 감사. 이 포럼은 훌륭합니다. – dysonfree

0

"크기 삭제"를 포함하면 새 기능을 사용하지 않았기 때문에 메모리 누수가 발생합니까?

일반적으로 delete을 호출하여 메모리 누수가 발생하지 않습니다. 당신 그리고 많은 시간 얻을 메모리 손상. 두 가지가 매우 다르다 : 메모리 누수는 프로그램이 실제로 사용하지 않는 메모리에 저장된다는 것을 의미한다. 누수 된 메모리가 계속 증가하면 프로그램이 중단 될 수있다. 메모리 손상은 어떻게 든 당신이 기억 속에있는 중요한 부기 구조를 어지럽히는 것을 의미하며, 아주 빨리 충돌 할 것입니다. (적어도 당신은 충돌을 기대해야합니다, 대안은 더 나쁩니다). One very common cause of memory corruption is deallocating memory with the wrong routine, 특히 Windows의 경우 (UNIX에서는 mallocfree을 다시 정의하는 전통이므로 UNIX 시스템 often go out of their way to make sure it's possible to do that).

또는 새가 전화 내부에 내부 CoCreateInstanceRelease()에 의해 처리되어야이야 무엇이든

이 CoCreateInstance를하는 것입니다. 적어도 포인터를 가지고 있기 때문에 결코 메모리를 할당 해제해서는 안됩니다. 올바르게 할당을 해제하기 위해 메모리가 할당 된 방법을 알아야합니다.

+0

고마워요. 아주 명확하게 설명했다. – dysonfree

1

delete을 사용하여 다른 모듈에서 구현 한 COM 서버를 출시하지 마십시오.

  1. 해당 서버가 C++로 작성되었는지 항상 알 수는 없습니다. 비 C++ 객체에서 delete을 수행하는 것은 정의되지 않은 동작입니다.
  2. 서버가 C++로 작성된 경우에도 할당 된 힙과 delete이 메모리를 올바르게 할당 해제하거나 정의되지 않은 동작을 트리거하는지 여부는 알 수 없습니다.
  3. 가상 소멸자가없는 것으로 선언 된 인터페이스 포인터에 delete을 호출합니다. 이는 정의되지 않은 동작입니다.
  4. 실제 개체 또는 프록시를 제공 받았는지 항상 알 수 없습니다. 프록시에서 delete을 수행하면 정의되지 않은 동작이 발생합니다.
  5. Release()을 호출하면 객체가 이미 자체 삭제되었을 수 있으며 delete을 다시 수행하면 정의되지 않은 동작이 발생합니다.
  6. 일부 제 3자가 개체의 소유권을 가져 왔을 수 있습니다. 예를 들어, 일부 전역 포인터 인스턴스가 개체로 설정되었을 수 있습니다. delete 다른 포인터가 매달려 나중에 정의되지 않은 동작이 발생할 수 있습니다.

결론 :이 경우에는 delete을 사용하지 마십시오. Release()으로 연락하여 개체의 소유권을 해제하면 충분합니다.