我有像
这样的结构struct category {
int id,newID;
std::string name;
};
和
之类的地图std::map<std::string, category> categories;
将详细信息插入地图是否安全,如
category x = {1,2,"Name"};
category y = {2,3,"Mike"};
categories["FIRST"]=x;
categories["SECOND"]=y;
或者我应该声明地图
std::map<std::string, category*> categories;
并制作结构指针并插入它?哪个更安全?
答案 0 :(得分:2)
你更安全的意思是什么?两种方法都很好。使用第二种方式时,必须确保删除类别对象。在第一个删除地图时,它们会自动删除。
如果你需要传递很多物体,那么第一个就会慢一些,因为你要制作副本。第二个就是复制指针。
因此,您需要决定哪一个符合您的需求。
答案 1 :(得分:1)
如果您的意思是资源泄漏的安全性,在您的特定示例中,第一个变体是完全安全的。
如果使用指针,您可能希望在堆上创建实例,这意味着手动内存管理,这很容易出错。
第二个解决方案可能具有的唯一问题(就安全性而言)是对象需要是可复制的。如果对象手动管理任何资源,则必须确保正确实现了copy-constructor和assignment-operator。
答案 2 :(得分:1)
如果没有更多背景,你的问题就无法得到解答。
一个天真的答案可能是“插入结构本身更安全,因为您不必担心内存泄漏”。但是,这样的答案并不令人满意。
要获得更好的答案,您必须考虑以下几个因素:
struct
应该是可复制的吗?换句话说,在您的应用程序域中,是否有相同结构的多个副本?如果没有,你应该使用指针。struct
目前的形式是可复制的,并且具有深层复制语义。是否有可能在将来添加会导致深层复制语义中断的成员?如果是这样,你将被迫以这种或那种方式处理。这与前一项有关,因为struct
的可复制性和复制语义会影响您的决定。map
可能有很多条目吗?它可能有很多条目,其中键不同但值不是?在这种情况下,使用指针将节省内存。答案 3 :(得分:0)
那很好[你的第一个例子]。这就是你应该怎么做的。
当你真的必须时,你应该只引入间接和动态分配[你的第二个例子],因为那时你必须管理对象的生命周期并且它更容易出错。
答案 4 :(得分:0)
我会将类别对象包装在智能指针中并存储智能指针。它不像存储整个对象那么重,允许访问真实对象,并会自动清理它自己。
答案 5 :(得分:0)
以下是关于如何使此代码更安全的说明:
我会为struct category
创建一个构造函数:
struct category {
category( int id, int newID, const std::string& name) :
id(id), newID(newID), name(name) {}
int id,newID;
std::string name;
};
例如,通过更改结构中id
和newID
的顺序,您就有机会不破坏代码。现在,您可以将其初始化为categories["FIRST"]=category(1, 2, "Name");
我会使用智能指针而不是普通指针:
std::map<std::string, boost::shared_ptr<category> > categories;
std::map<std::string, category>
也可以,但它会复制category
个对象。如果它们足够大,这可能是性能问题。