"새로 만든"벡터를 삭제하는 사람이 없어서 메모리가 누출됩니다.
왜 벡터에 대한 포인터가 있습니까? 값 비싼 생성자에 복사하는 것에 대해 걱정하십니까? 지금까지,
Vector<CCPoint> p;
A a(p);
을 안 :
class A{
public:
A(vector<CCPoint> p);
private:
vector<CCPoint> p;
}
변경 initialiser 목록을 사용하는 생성자 :
A:A(vector<CCPoint> newP) : p(newP){
// Empty
}
을 그리고 다음과 같이 호출하지
변경 회원은 벡터가 될 수 있습니다 왜 당신이 그렇게하고 있는지 정확히 알지 못한다면, 심지어는 다시 생각해 보지 않는 한, "새로운"객체를 생성하십시오.
성능 참고 : 예 은 컴파일러의 복사 제거에 따라 벡터 복사를 발생시킵니다. 대안 C++ 11 멋진 바지 솔루션은 이동을 사용하는 것입니다 :
class A{
public:
A(vector<CCPoint> p);
private:
vector<CCPoint> p;
}
A:A(vector<CCPoint> newP) : p(std::move(newP)){
// Empty
}
Vector<CCPoint> p;
A a(std::move(p)); // After this completes, 'p' will no longer be valid.
그래서 무엇이 (명백한 오타 외에) 잘못 되었습니까? 이 접근 방식에 대해별로 마음에 들지 않는 특정 사항이 있으면 알려주십시오. –
젠장, 널 포인터 예외가있어,하지만 지금은 초기화하기 전에 벡터를 사용하는 것을 볼 수 있습니다. 며칠 동안 잠을 못 자면 그 일이 일어납니다. 솔직히 말해서 @polka 솔직히 말해서 나는 C++을 많이 사용하지 않았기 때문에이 규칙을 사용했다 : "모든 프리미티브가 아닌 변수 앞에 *를 추가하면 Java와 비슷하게 작동한다"는 것을 적어도 경험했다. 나는 그것이 무례하다는 것을 안다 ... 어쨌든 당신의 답변을 주셔서 감사합니다. –
_ "모든 프리미티브가 아닌 변수 앞에 a *를 추가하면 자바처럼 작동 할 것입니다"_ 끔찍한 규칙입니다. C++에는 네이티브 가비지 컬렉터가 없으므로 Java처럼 작동하지 않습니다. – Chad