[英]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.