返回在 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() 函数之外创建的对象的地址的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回对象(R)

C ++:从函数、返回类型或引用中使用和返回字符数组?

在函数中使用Knockout push会返回错误

如何在回调后将值返回给main函数

三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)

函数调用模型