C++宏以确保释放已用内存
C++ macros to ensure used memory is freed?
所以我有点n00b,正在阅读有关new
,delete
和指针的信息,我确信我会在我的一生中忘记太多的删除。 所以我想知道像下面这样的宏是否会比它的价值更麻烦。
#define withObject(ptr, value, BODY)
{
ptr = value;
BODY
delete ptr;
ptr=NULL
}
此宏是否会导致一些问题或以意外的方式运行?
编辑:哎呀,我离开了释放的d。 谢谢大家的回答。
不,不要这样做。它不会阻止内存泄漏或杂散指针。相反,请阅读智能指针。当前的标准提供了一个auto_ptr形式的标准,但根据您的C++平台,还有更多(和更好的)可用。
另外,我怀疑您可能过度使用new和delete-它们应该很少在您的代码中使用。您应该更喜欢使用值。所以不是这样:
string * s = new string ( "foobar" );
....
delete s;
你应该简单地写:
string s( "foobar" );
并让编译器为您管理字符串的生存期。
无需在这里重新发明轮子,您正在寻找智能指针。
非常有用的 Boost 库具有智能指针功能。
谷歌RAII习语;它是一样的,但不是那么笨拙;然后,您可以使用无处不在的智能指针(当它们超出使用/范围时自动释放内存)将其应用于动态分配。
Boost包含最著名/最广泛的智能指针版本(seveal口味)。
C++标准一直有一种残缺的智能指针,命名为auto_ptr
。这是一个有警告但本身有用的(RTFM!
C++0x采用了几个Boost TR1类,包括最流行的智能指针(我希望我的措辞是正确的,因为标准通常对细节非常具体)
呵呵
您正在寻找智能指针模式。这是标准C++,并在此站点进行了详细解释。
除了你真的应该使用智能指针(即使是卑微的auto_ptr
也可以为你的目的服务),BODY 可能存在问题。 使用可能很大的代码段作为类似函数的宏的参数有其自身的陷阱。 例如,如果 BODY 中有一个不带括号的逗号,则 BODY 将转向两个参数。 我不确定还有什么问题,因为我从未见过有人尝试过。
不要在C++中使用类似函数的宏。 这很少值得。
看起来您希望分配一个对象,对其进行简短的工作,然后将其删除。为此,我建议使用std::auto_ptr。
执行此类操作的惯用C++方法不是使用宏,而是使用使用资源的"智能指针"类 资源获取是初始化。 例如,Boost的scoped_ptr可以在宏有意义的上下文中很好地工作。
我将在这里放一个智能指针类的草图 - 但我省略了很多细节。 这只是为了让您了解它们的工作原理。 改用scoped_ptr,他们没有遗漏任何东西。
template <typename T>
class smartptr<T> {
public:
smartptr() : ptr(new T) {}
smartptr(T* p) : ptr(p) {}
~smartptr() { delete ptr }
T& operator*() { return *ptr; }
T* operator->() { return ptr; }
private:
T* ptr;
}
此宏是否会导致一些问题或以意外的方式运行?
如果 BODY 引发异常,则将跳过delete
。
解决方案是使用"RAII"成语。这是现代C++编程中最重要的概念之一。
更好的解决方案是分配和删除宏而不是包罗万象。这是一件非常混乱,不是很有帮助的事情
当我用C编程时,我通常会做如下的事情:
#define ALLOC_ARY(type, sz) (type*)calloc(sz, sizeof(type))
#define ALLOC_STR(sz) ALLOC_ARY(char, sz)
char *string = ALLOC_STR(128);
int *array = ALLOC_ARY(int, 20);
但是记住在原版 C 中自由只是其中的一部分:
free(string); string = NULL;
free(array); array = NULL;
编辑:对于C++,其他人建议的智能指针是一个很好的方法。
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放