返回在 main() 函数之外创建的对象的地址
Posted
技术标签:
【中文标题】返回在 main() 函数之外创建的对象的地址【英文标题】:Returning the addresses of objects created outside the main() function 【发布时间】:2009-03-03 19:04:27 【问题描述】:我正在尝试创建一个链接列表,但我在函数内创建对象和分配指向其地址的指针时遇到了麻烦,因为我相信当函数退出时它们会超出范围。这是真的?而且,如果是这样,我怎样才能在 main 之外创建一个对象并仍然使用它?
【问题讨论】:
你也可以发布一些代码吗? 【参考方案1】:你是对的,局部变量会在功能块的末尾超出范围。您需要创建指向对象的指针并使用new 分配它们。当您从列表中删除对象时,不要忘记删除它。
如果您不想处理指针带来的麻烦和错误,请参阅boost::shared_ptr。
【讨论】:
他似乎是这门语言的新手。我的猜测是他正在为学校作业实现一个链接列表(否则他会使用 STL 或类似的东西)。他可能不应该使用第三方库,因为这会破坏任务的重点。当然,这一切都只是猜测……【参考方案2】:使用新运算符:
void f()
CMyObject *p = new CMyObject();
List.AddTail(p); // Or whatever call adds the opbject to the list
当你的列表被销毁时,注意删除对象。
【讨论】:
【参考方案3】:使用 new 运算符创建对象。即
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;
【讨论】:
它创建了新的 bar1 和 bar2 指针,但是你可以从 main() 访问这些指针吗? bar1 和 bar2 是函数的参数;因此,分配给两个新操作的内存由传递给函数的两个指针指向两个。调用 foo 后,thing1 和 thing2 指向完全相同的内存,因为 ARE bar1 和 bar2。希望对您有所帮助。【参考方案4】:为什么不在列表中存储对象(不是指向对象的指针)? Creator-function 将返回对象。
如果您确实需要指针列表,请考虑使用特殊的指针列表容器 (boost::ptr_list
) 或在其中存储智能指针 (boost::shared_ptr
)。为了防止对象从函数返回后超出范围,需要使用 operator new 动态分配它们。
【讨论】:
【参考方案5】:接受的答案不正确。在函数中
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
【讨论】:
以上是关于返回在 main() 函数之外创建的对象的地址的主要内容,如果未能解决你的问题,请参考以下文章