如果我有一个包含指针的模板类A
,并且A
具有将返回该指针的隐式转换运算符,如果我打算将delete
应用于delete
以便我需要或应该为运算符定义A
这个班的对象?如果我有运算符T *(),是否需要重载删除?
回答
我相信你有类似以下内容:
template <typename T>
struct A {
T * t;
operator T*() { return t; }
};
的打算“应用delete
这一类的对象”,所以由我假设你的意思是:
void foo()
{
A<int> * p = new A<int>;
delete p; // Applying 'delete'
}
如果是这种情况,那么正确删除的调用会破坏对象并释放在前一行使用'new'分配的内存,并且对您的问题的回答为'no'。
因为您已声明转换运算符的指针,所以能够A<int>
类型的对象(一个反对A<int>*
)上使用delete
。采用delete
将被应用到调用转换操作符的结果:
void foo()
{
A<int> a;
a.t = new int;
delete a; // Same as: delete a.operator T*()
}
基础:
表达delete p
,做两个不同的东西。首先,它调用p
指向的对象的析构函数,然后释放内存。如果你为你的类定义了一个operator delete
成员,那么这个函数将被delete p
用来释放内存。
一般来说,当你想控制应该如何分配或释放该类的动态对象的内存时,只需定义这些操作符。
您只需要定义运营商删除如果您定义运营商新 - 在这种情况下,你几乎必须这样做。
这并不意味着某些东西不需要删除您的A * - 但您不需要为此定义任何操作符,它将在默认情况下起作用。
如果您类拥有这个指针,它应该在其析构函数删除它。请注意,重载此操作符可能会造成混淆,因为获取指向对象的常用方法是通过获取其地址。
删除它的“析构函数”,是吗? – 2011-03-30 17:16:33
@ Ernest:的确 - 固定的。 – 2011-03-30 17:17:56
关于你的第二点,你在想'操作员'吗?重载“operator T *”不应该影响取对象的地址? – 2011-03-30 18:39:32
您是否需要定义一个隐式转换运算符?A
真的需要定义一个隐式转换运算符吗?也许有一个简单的T* get() const
方法返回指针,就像boost和std智能指针一样。隐式转换会造成各种麻烦。
- 1. 重载运算符T ***()
- 2. 我们是否需要重载==操作符,如果我已经重载<?
- 3. 当我们重载新运算符时,是否有必要重载新运算符?
- 4. 运算符重载“运算符T *()”产生比较运算符?
- 5. C++重载运算符new删除,
- 6. 重载delete运算符来删除库
- 7. 运算符重载删除函数
- 8. 我是否需要删除此对象?
- 9. 我是否需要删除对象?
- 10. 是否dwscript支持运算符重载
- 11. Java是否支持运算符重载?
- 12. 在此示例中是否为重载运算符=必需的?
- 13. 如果我运行转换,我是否需要删除bitbucket repo并重新创建它?
- 14. 我是否需要手动声明> =和<=运算符?
- 15. 是否有可能在字符串上重载〜运算符?
- 16. QState的所有权。我是否需要删除所有QStates?
- 17. 是否有可能通过重载算术运算符级联重载提取运算符?
- 18. 在类中重载运算符是否需要使用__declspec(dllexport)(如果它们用于DLL项目中)?
- 19. 有关运算符重载
- 20. 是否总是需要删除MapReduce中的重复项?
- 21. 如果我们在modules.conf中添加或删除模块,我们是否需要重新安装所有内容?
- 22. 我是否需要重载一个类的演员操作符?
- 23. 我是否必须删除此对象? (如果我不打算被删除)
- 24. 运算符重载 - 重载*
- 25. 我该如何重载[]运算符?
- 26. 如果我需要更换VBO,是否需要重建我的VAO?
- 27. 是否需要删除静态向量?
- 28. 是否有可能在C++中重载运算符关联性?
- 29. 是否有可能在C中重载运算符?
- 30. 是否有可能在C++中重载运算符“...”?
谢谢理查德。是的,这就像我最后一个例子一样。我担心原则上可能存在模棱两可的情况:比如说有多个转换操作符返回指针。 – user2023370 2011-03-30 19:47:04
如果你有多个转换操作符到一个指针类型,那么在对象上使用'delete'将是一个编译错误。 C++'11的FDIS表示:“操作数应该有一个指向对象类型的指针,或者是一个具有单个非显式转换函数(12.3.2)的类类型,指向对象类型的指针。 – 2011-04-19 18:12:55