2014-07-17 4 views
0

로 만드는 목적 :C++ 내가 매개 변수로 내 사용자 지정 개체와 방법이 * 새로운

void processObject(Myobject instance) 
{ 
//some code using instance 
} 

나는이 같은 다른 방법에서 위의 메소드를 호출하고 있습니다 :

... 

processObject(*new MyObject()); 

... 

을 수있는이 원인 메모리 누출? 프로세스 객체 메서드에서 & 인스턴스를 삭제해야합니까?

도움을 주셔서 감사합니다. 당신이이 문제를 해결하는 가장 쉬운 방법으로 제안 어떤 지금은 메모리 누수가 있다는 것을 알고

확인

편집,? 나는이 가능한 (많은 많은 장소에 코드에서 같은 문제를) 해결하기 위해 쉽고 빠른 방법이 필요

void processObject(Myobject* instance) 
{ 
//some code using instance 
    delete instance; 
} 

... 

processObject(new MyObject()); 

... 

: 내 생각이 코드를 변경하는 것입니다.

+1

왜 처음에'new'를 사용합니까? 왜 단지'processObject (MyObject());'가 아닌가? –

+0

어디에서나'delete'를 호출 했습니까? 아니, 할 수 없기 때문에. 그래서 당신은 메모리 누수가 있습니다. – juanchopanza

+0

삭제가 전혀 호출되지 않았습니다 -이 프로젝트에 들어가서이 코드를 여러 곳에서 발견했습니다. 그래서 이것을 고칠 수있는 가장 쉬운 방법은 다음과 같습니다 : –

답변

2

processObject 프로 시저가 수신하는 인스턴스 개체는 new으로 만든 개체의 복사본이므로 삭제할 수 없습니다. 그런 식으로 상상 :

  1. 당신은 new을 사용하여 새 객체를 생성, 이것은 힙에 객체를 생성하고 당신에게 포인터 역 참조 MyObject*
  2. 당신을 제공, 그러므로 유형 MyObject의 객체를 가지고있다. 여기서 아무 것도 저장하지 않으므로 포인터가 손실됩니다.
  3. processObject 메서드에 개체를 전달하면 해당 함수의 서명에 따라 개체 복사본이 만들어져 함수
  4. 으로 전달됩니다

포인터를 분실 했으므로 더 이상 포인터를 삭제할 수 없습니다.

해결책은 new으로 객체를 할당하지 될 및 처리 방법에에 refrence을 통과 :

void processObject(MyObject& ref) { 
    // do something with the reference 
} 

void test() { 
    MyObject x; 
    processObject(x); 
    // do stuff with x 
} 

또는 new로를 할당하고이 일을 :

void processObject(MyObject* ptr) { 
    // do something with the pointer 
} 

void test() { 
    MyObject* x = new MyObject(); 
    processObject(x); 
    // do stuff with x 
    delete x; 
} 
+0

나중에 삭제하는 것을 잊지 않고 RAII 또는 스마트 포인터를 사용하는 것을 고려하십시오 – doctorlove

+0

오른쪽에 'delete'를 추가했습니다.) – maxdev

+0

더 나은 ...하지만 예외는 아니지만 안전합니까? – doctorlove

0

예, 당신이해야 새 후에 삭제하지만이 새로 생성 된 객체는 삭제할 수 없습니다.

*new x;을 쓸 때마다 실제 참조 (또는 객체)에 포인터를 역 참조합니다.
Myobject가 값으로 전달되어 복사되므로 스택 공간에 포인터가 남아 있지 않아 메모리 누수가 발생합니다.

난 당신이 거의 같은 효과를 다음 호출 프로 시저를 사용하는 것이 좋습니다 : (메모리 누수없이) :
processObject(MyObject());

을 나는 당신이 우리가 사용하도록 강요 자바의 새로운 문법을 찍었을 것 같아요 그것.C++에서는 단순히 생성자를 이와 같이 암묵적으로 호출하여 새 객체를 내부에 구성한 다음 함수 인수로 전달할 수 있습니다.
이 경우 개체가 스택에 구성되므로 자동 저장 기간 (메모리 누출 없음)이 있습니다.

0

메모리 누수가 있습니다. 당신은 그러나 서명

void processObject(Myobject instance) 

지역 변수/스택 객체를 전달하지 못하게하지 않습니다 주소를 취함으로써 processObject 함수 내에서 객체를 삭제할 수 있습니다.

Myobject instance; 
processObject(instance); 

이 경우 delete 개체를 사용할 수 없습니다.

원시 포인터를 사용하지 말고 사용자의 기능을 혼란스럽게하지 마십시오.

0

시도 :

class MyObject 
{ 
public: 
    MyObject() { std::cout << "Reporting construction of object (ptr: " << (int)this << ")\n"; } 
    MyObject(const MyObject & other) { std::cout << "Reporting copy-construction of object (ptr: " << (int)this << ")\n"; } 
    MyObject(MyObject && other) { std::cout << "Reporting move-construction of object (ptr: " << (int)this << ")\n"; } 
    virtual ~MyObject() { std::cout << "Reporting destruction of object (ptr: " << (int)this << ")\n"; } 
}; 

void DoSomething(MyObject obj) 
{ 
} 

int main() 
{ 
    DoSomething(*new MyObject()); 
} 

결과 :

Reporting construction of object (ptr: 140173320) 
Reporting copy-construction of object (ptr: -1078250292) 
Reporting destruction of object (ptr: -1078250292) 

보시다시피, 첫 번째 인스턴스가 파괴되지 않았습니다 - 따라서 유출.