2017-11-15 26 views
-1

다음과 같은 방법을 사용하면 괜찮은지 알고 싶습니까? 구문 오류 및 경고는 없지만 메모리 문제가 있는지 알고 싶습니다.다음과 같은 메모리 할당 방법을 사용하면 괜찮은지 알고 싶습니다.

#include <iostream> 
using namespace std; 

class test { 
    int* x; 
public: 
    test(int *n) { this->x = new int(*n); } 
    inline int get() { return *x; } 
    ~test() { delete x; } 
}; 

int main(void) { 
while(1){ 
    test a(new int(3)); 
    cout << a.get() << endl; 
} 
    return 0; 
} 
+6

3/5/0 규칙을 위반합니다. –

+3

'a' 생성시 메모리 누수가 있습니다 – Slava

+0

어떻게 규칙을 위반하지 않도록 변경할 수 있습니까? –

답변

4

당신은 당신의 코드에서이 문제가 :

다음 코드에서 :

test a(new int(3)); 

동적 값 3 int을 할당하고 값을 사용하고 동적으로 int 할당 자신의 것 생성 a ctor에 패스. 그 후에이 기억은 유출된다. 당신이 클래스에 동적으로 할당 된 데이터는 스마트 포인터를 사용하여 전달하려는 경우

class test { 
    std::unique_ptr<int> x; 
public: 
    test(std::unique_ptr<int> n) : x(std::move(n)) { } 
    int get() const { return *x; } 
}; 

int main() 
{ 
    x a(std::make_unique<int>(3)); // since c++14 
    x a(std::unique_ptr<int>(new int(3))); // before c++14 
    ... 
} 

및 명시 적 dtor를 구현할 필요가 없습니다, 당신은 규칙을 위반하지 않고는 ctor에 동적으로 할당 된 데이터를 전달하는 것이 안전합니다 .

참고 : 예를 들어 int을 사용한다고 가정했는데 동적으로 하나만 할당하면 int은 쓸모가 없습니다. 값으로 저장해야합니다.

+0

복사 생성자를 추가하고 다음과 같이 코드를 변경하면 : 'int * p = new int (3); 시험 a (p); 삭제 p;' 괜찮습니까? –

+0

@LukaMamulaishvili 복사 생성자 * 및 할당 연산자 (규칙 3). 둘 다 5 가지 규칙에 맞게 이동 의미론을 사용합니다. 그 외에도, 당신은 맞습니다 ... – Aconcagua

+0

@LukaMamulaishvili 그런데, 임시 배열을 위해, 다른 방법으로도 갈 수 있습니다 : 스택에 그것을 할당하십시오 :'int p [] = {3}; 테스트 (p); (물론, 항상 적절한 것은 아니지만 if, ...). – Aconcagua

3

당신은 3의 규칙 (C++ 11 이후 5)을 위반하고 있습니다. 즉, 소멸자를 정의 했으므로 복사/이동 생성자/연산을 정의해야합니다.

구현시 복사/이동 생성자/연산이 잘못되었습니다. 개체를 복사하면 포인터의 얕은 사본이 삭제되어 삭제되므로 두 번 삭제됩니다. 그것을 이동할 때 할당하지 않은 포인터를 삭제할 것입니다.

보너스 포인트 : 인라인 쓸모가