繁体   English   中英

保留对象和对在函数内部创建的对象的引用

[英]Keep object and reference to an object created inside a function

我是C ++的新手,所以仍然学习指针并习惯使用它们。

我已经声明了一个对象映射,以便存储用户以后可以使用标记键访问的对象。

map<string,MyObject*> myMap;

我要添加到myMap的对象是在我的main调用的函数中创建的

void myFunction(){
    ...
    MyObject obj1();
    MyObject* objPtr;
    objPtr = &obj1;
    myMap.insert(pair<string,MyObject*>("xxxx", objPtr));
    ...
    } 

当我执行此函数时,对象指针已完美插入到myMap中,但是执行完函数后,我丢失了对obj1的引用,因为指针和对象是在函数内部本地创建的,所以在其中仍然有一个元素“ xxx”地图,但我认为之后是空参考。

如何全局保存对象和参考? 我想在函数中创建此对象,因为它具有一些需要从用户obj1(m,n)获取的可变参数。 谢谢你的帮助。

代码行

MyObject obj1;

定义一个保存MyObject实例的局部变量。 一旦将要保留此变量的上下文,该对象将被销毁。 销毁对象并不意味着指向它们的指针将以任何方式得到通知(例如,它们未设置为0),访问它们是无效的。

您基本上有以下选择:

  • 堆上而不是本地上创建对象。 这是使用new关键字完成的。 但是随后您必须在某个时候delete对象。

     MyObject *obj1 = new MyObject(arguments...); 
  • 由于通常难以管理,因此发明了智能指针 例如,自C ++ 11起,添加了shared_ptr (但在预发行版本为C ++ 0x的某些编译器中也可用)。 当最后一个引用被销毁时,这种类型的智能指针将自动为您删除对象。

     map<string,std::shared_ptr<MyObject>> myMap; // Note that I changed the type std::shared_ptr<MyObject> obj1 = std::make_shared<MyObject>(arguments...); myMap.insert(std::make_pair("xxxx", obj1)); 

    顺便说一下,我使用了std::make_pair ,它将自动为您推断出模板类型

  • 将值存储在地图中。 根本不要使用指针。 如果可以复制您的类型(某些类型不能复制)以及某些设计决策不禁止这样做,则可以使用此选项。 但是在大多数情况下,将值存储在地图中将是一个好主意。 从地图中获取要修改的元素时,请使用引用:

     MyObject &obj = myMap["xxxx"]; // looking up the key obj.doSomeAction(); // modify it; no need to re-insert 

    引用的行为类似于指针(即,它们仅“指向”某个实例),但是存在一些差异。 例如,引用在其生命周期中始终指向同一实例(您不能重新分配引用)。 同样,它们的语法等于值,即不需要->

就个人而言,如果您不需要在程序中的多个位置放置指向同一对象的指针,则我希望使用第三个选项。 如果真是这样,我们说的是“共享”对象,这正是您要使用“共享”指针的情况。 第一种选择是非常低级的,应该被认为是“过时的”。

除非您有充分的理由这样做,否则将对象存储在地图中可能会更简单:

map<string, MyObject> myMap;

然后:

void myFunction(){
  ...
  myMap.insert(std::make_pair("xxxx", MyObject()));
  ...
} 

您可以动态实例化对象。

MyObject* objPtr = new MyObject;

但是当您不再使用它时,请不要忘记删除该实例

delete objPtr;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM