繁体   English   中英

C ++宏确保释放已用内存?

[英]C++ macros to ensure used memory is freed?

所以我有点像n00b并正在阅读newdelete和指针,我确信在我的生命中我会忘记太多的删除。 所以我想知道像下面的宏是否会比它的价值更麻烦。

#define withObject(ptr, value, BODY)                       \
{                                                           \
     ptr = value;                                           \
     BODY                                                   \
     delete ptr;                                            \ 
     ptr=NULL                                               \
}

这个宏会导致一些问题或以意想不到的方式表现吗?

编辑:oops我离开了d on freed。 谢谢大家的答案。

不,不要这样做。 它不会阻止内存泄漏或杂散指针。 相反,请阅读智能指针。 当前标准提供了auto_ptr的形式 ,但是有更多(和更好的)可用,具体取决于您的C ++平台。

另外,我怀疑你可能过度使用new和delete - 它们应该在代码中很少使用。 您应该更喜欢使用值。 所以不要这样:

string * s = new string ( "foobar" );
....
delete s;

你应该简单地写:

string s( "foobar" );

并让编译器为您管理字符串的生命周期。

不需要在这里重新发明轮子,你正在寻找智能指针

非常有用的Boost库具有智能指针功能。

谷歌RAII成语 ; 它是一样的,但不是那么hacky; 然后,您可以使用无处不在的智能指针(当它们不使用/范围时自动释放内存)将其应用于您的动态分配。

Boost包含智能指针(seveal flavors)最着名/最普遍的版本。

C ++标准总是有一种残缺的智能指针,名为auto_ptr 这是一个有警告但有用的(RTFM!)。

C ++ 0x采用了几个Boost TR1类,包括最流行的智能指针(我希望我的措辞是正确的,因为标准通常在细节上非常具体)

HTH

你正在寻找智能指针模式。 它是标准的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 ++编程中最重要的概念之一。

我认为更好的解决方案是制作分配和删除宏而不是包含所有内容。 这是一个非常混乱,不是很有帮助的事情

当我在CI中编程时,通常会执行以下操作:

#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 ++,其他人建议的智能指针是一个很好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM