링크 목록을 만들려고하지만 함수 내에 객체를 만들고 해당 주소에 포인터를 할당하는 데 문제가 있습니다. 함수가 종료됩니다. 사실입니까? 그리고 만약 그렇다면, 메인 외부의 오브젝트를 어떻게 만들 수 있습니까?main() 함수 외부에서 생성 된 객체의 주소를 반환합니다.
0
A
답변
0
새 연산자로 개체를 만듭니다. ie
void foo(myObject* bar1, myObject* bar2)
{
bar1 = new myObject();
bar2 = new myObject();
// do something
}
int main(int argc, char* argv[])
{
myObject* thing1;
myObject* thing2;
foo(thing1, thing2);
// Don't forget to release the memory!
delete thing1;
delete thing2;
return 0;
}
3
올바른 지역 변수는 기능 블록 끝에서 범위를 벗어납니다. 개체에 대한 포인터를 만들고 new으로 할당해야합니다. 그리고 목록에서 제거 할 때 개체를 삭제하는 것을 잊지 마십시오.
포인터와 관련된 번거 로움과 버그를 처리하고 싶지 않은 경우 boost::shared_ptr을 참조하십시오. 목록이 파괴 될 때 삭제를 반대하는
void f()
{
CMyObject *p = new CMyObject();
List.AddTail(p); // Or whatever call adds the opbject to the list
}
에주의 :
2
는 new 연산자를 사용합니다.
0
왜 개체에 포인터가 아닌 목록에 저장하지 않습니까? 생성자 함수는 객체를 반환합니다.
정말 포인터 목록이 필요하면 특수 포인터 목록 컨테이너 (boost::ptr_list
)를 사용하거나 스마트 포인터를이 포인터에 저장하는 것을 고려하십시오 (boost::shared_ptr
). 함수에서 복귀 한 후에 객체가 범위를 벗어나지 않게하려면 new 연산자를 사용하여 객체를 동적으로 할당해야합니다.
0
허용되는 대답이 올바르지 않습니다. 함수에서
void foo(myObject* bar1, myObject* bar2)
{
bar1 = new myObject();
bar2 = new myObject();
// do something
}
새로 할당 된 개체는 로컬 변수에 할당됩니다. 호출 함수의 포인터 값에는 영향을주지 않습니다. 당신이 필요로하는 무엇
int main(int argc, char* argv[])
{
myObject* thing1;
myObject* thing2;
foo(thing1, thing2); // thing1 and thing2 don't get assigned
// They continue to be uninitialized in
// this function
// Don't forget to release the memory!
delete thing1; // These two deletes will lead to undefined behavior.
delete thing2;
return 0;
}
은 다음과 같습니다
이void foo(myObject*& bar1, myObject*& bar2)
{
bar1 = new myObject(); // Now the value of the pointers in the calling
bar2 = new myObject(); // will be changed since the pointers are passed by reference.
// do something
}
당신이뿐만 아니라 몇 가지 코드를 게시 할 수 있습니까? – dirkgently