이것은 불가능할 수도 있지만 일시적으로 원래의 표현보다 오래 지속될 수 있는지 궁금합니다. 나는 부모 객체를 가리키는 객체의 체인을 가지고 있고, 자식 객체를 생성하는 멤버 함수는, 단순화 된 예는 여기일시적으로 수명이 연장되지 않도록 하시겠습니까?
class person{
string name;
person * mommy;
public:
person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
person baby(const string & nam){
return person(nam, this);
}
void talk() const{
if (mommy) mommy->talk();
cout << name << endl;
}
};
int main(){
person("Ann").baby("Susan").baby("Wendy").talk(); // fine
const person & babygirl = person("Julie").baby("Laura"); // not fine
babygirl.talk(); // segfault
return 0;
}
내가 person
함수에 전달하는 데 사용하려는 방법입니다 다음과 같은 내용이 있습니다.
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
괜찮습니까?
임시 테이블이 원래 표현식보다 오래 살아남지 않는 한 정상적으로 작동합니다.하지만 마지막 임시 테이블 중 하나를 const 참조에 바인딩하면 해당 부모가 살아남지 않고 segfault가 생깁니다. person
의 복사본 생성자와 할당 연산자를 숨길 수는 있지만 이런 종류의 오류가 발생하는 것을 막을 수있는 방법이 있습니까? 가능한 경우 동적 할당을 피하고 싶습니다.
@Konrad : Ironic; -] – ildjarn
이 코드는 같은 방식으로 "좋지 않습니다" 'const int & i = std :: vector (1) [0]; '을 쓰는 것은 "좋지 않습니다"라고 말합니다. 'vector'는 당신이 글을 쓰는 것을 멈추지 않으며, 그렇게 할 필요가 없습니다. 여기서 핵심은 엄마를 파괴하면 아기를 사용할 수 없게되므로 아기는 엄마의 일부입니다. 그것이 디자인에있어 잘못된 것입니다. 반 직관적입니다. 고아와 같은 것이 존재하지 않도록 방지함으로써 패치를 적용하려고합니다. 그러나 고아가 더 잘 정의 된 행동을 가져야하는지 또는 더 분명히 나쁜 것으로 만들어야하는지 고려해야합니다. –
Steve와의 합의 : 이것은 잘못된 디자인을 보여주는 것입니다.벌거 벗은 포인터의 모양은 뭔가 떨어져 있다는 것을 알려 줘야합니다. –