【发布时间】:2014-11-22 03:32:41
【问题描述】:
我有以下代码:
class A;
typedef map<string, A*> AMap;
AMap _amap;
当我尝试分配一个新的 A 并将其保存到地图时:
A a = A(str);
_amap[str] = &a;
然后它会在我的程序结束之前调用A 的析构函数。 (我有一个 A 的静态成员来计数对象,当我想检查有多少对象时返回零)
但是,当我尝试时:
_amap[str] = new A(str);
一切正常,但没有调用析构函数。这是为什么呢?
这两种方法有什么区别?
谢谢。
更新
我之所以使用A*而不是A是因为我有另一个AList,它是一个向量,将存储同一个对象。我使用指针是因为我不想浪费内存。
【问题讨论】:
-
前者添加一个自动变量的地址,后者是一个动态分配的变量。 你动态分配它。这意味着您要么使用知道如何正确清理的智能指针来管理它,要么自己承担责任,就像你分配它一样。
-
@WhozCraig 解释了为什么在第一种情况下调用析构函数?因为我不明白为什么。
-
自动这个词是必不可少的。不管你是否知道,你剩下的就是一张带有悬空指针的地图。 IE。地图中的指针仍然存在,但只要
a离开自动范围(周围的{... }),对象就会被销毁。如果您不知道,即使是评估,更不用说取消引用悬空指针会调用未定义的行为。下面的两个答案在如何管理这个问题上都是准确的,值得一提。请仔细阅读。 -
有什么理由不使用
map<string, A>?为什么是指针? -
之所以我使用
A*而不是A是因为我还有另一个AList,它是一个向量,会存储同一个对象。我使用指针是因为我不想浪费内存。
标签: c++ class object memory-management constructor