【发布时间】:2012-02-09 13:16:35
【问题描述】:
我希望我的班级是:
class NumberedString : public Object {
public:
String newName;
short nameID;
NumberedString(String &newName, short nameID) : newName(newName), nameID(nameID) {}
};
HashMap uniqueStrs;//For later.
此实例化将传递给HashMap,该HashMap 接管其堆分配的所有权:
在 HashMap.h 中(比如说):
virtual result Add(const Object& key, const Object& value);
现在这就是我感到困惑的地方。我在调用Add 的行中分配了String:
uniqueStrs.Add(*(new String(L"XYX_say")), *pNewLoc);
HashMap 然后会为我释放这个内存,尽管只接受对它的引用。也许我在新千年中失去了 C 十年,但我认为这是不可能的?
如果不是,那么我应该能够写出类似的东西:
~NumberedString() {
delete &newName;
}
对于我的班级,但我永远不会猜到,除非我看到这个库 HashMap::RemoveAll() 做同样的事情。 This question 表示这是不可能的,但要依赖 auto_ptr 和 shared_ptr 但我的“平台仅支持 STL(标准模板库(http://www.sgi.com/tech/stl/))。” (在整个“标准 C++ 库”中)。请所有答案都不要这样引用。
谢谢。
cmets 提示的链接
我无法将链接发布为 cmets,因此请查看 Add 方法及其建议使用示例:here 而 Benj,String 不是 std::string 不,抱歉。
也
我知道尝试删除堆栈对象可能会导致崩溃,但我不明白HashMap 如何声称能够删除堆对象。我已经编写了上面的类来尝试重新创建这种行为,但我无法完成这一壮举,因此提出了问题。
回应“无用”
@Useless:可能不能将变量*pBar 传递给foo(int &bar),声明为int pBar = new int(1);,然后foo 拥有所有权
foo(int &bar) {
int *__pBar = &bar;
delete __pBar;
}
?我打算尝试,但我开始谨慎,不要太相信文档所说的内容。虽然它是从标题中生成的
class _EXPORT_BASE_ HashMap :
public IMap,
public Object
{
virtual result Add(const Object& key, const Object& value);
//other stuff
};
【问题讨论】:
-
那么你的问题是什么?你的代码可以编译吗?
Add()参数在我看来不正确。 -
@BojanKomazec:我刚刚链接到具有
Add(const Object &key...)的类,并且仍然声称能够为您删除它们! developer.bada.com/help/topic/com.osp.cppapireference.help/… -
“String”实际上是 std::string 吗?
-
uniqueStrs.Add(*(new String(L"XYX_say"), *pNewLoc))几乎可以肯定没有做你想做的事,它立即尊重指针并泄漏内存......你按值传递到哈希映射中。 -
回复。最后一次 (
foo/bar) 编辑:你完全可以做到这一点,事实上确实如此。我只是说他们选择了一种愚蠢的误导方式来表达所有权的转移,因为您通常为此使用指针。
标签: c++ memory-leaks pass-by-reference bada ownership