C ++中的内存释放问题

时间:2010-12-06 04:47:26

标签: c++

我们的代码类似于下面的代码。我们正在尝试使用一个名为MemRelease类的类来实现RAII。现在,FXOMemRelease正在以sample.cc中显示的方式使用。

这样可以使用FXOMemRelase这样的对象吗?大多数时候,我发现只有MakeString()完成后才会调用MemRelease的析构函数。没关系。
总是这样吗?我们遇到了内存问题,并且truss输出最后指向了MemRelease类中的print语句。

MemRelease.cpp

template<typename T>
MemRelease<T>::MemRelease(T* store, unsigned char array_yesno, short release_yesno)
        : ptr(store), array(array_yesno), release(release_yesno)
{
}


template<typename T>
T* MemRelease<T>::getStore()
{
        return (ptr);
}

template<typename T>
MemRelease<T>::~MemRelease()
{
        if (!release) return;
         if ( (array == 'Y') || (array == 'y') )
        {
                cout << "deleting array in MemRelease pid = " << getpid() << endl;
                delete [] ptr;
                ptr = NULL;
        }
        else
        {
                cout << "deleting memory in MemRelease pid = " << getpid() <<  endl;
                delete ptr;
                ptr = NULL;
        }
}

Sample.cc:

char* MakeString(char* str)
{
   cout << "Entered MakeString\n";
   char* newstr = new char[strlen(str) + 1];
   strcpy(newstr, str);
   return str;
}
int main()
{
   char *str = new char[10];
   strcpy(str, "jagan");
   char* newstr = MakeString(MemRelease<char>(str).getStore());

   getchar();
   delete newstr;
}

2 个答案:

答案 0 :(得分:3)

而不是使用delete,请使用delete[]因为您使用new []分配内存。

由于您使用的是C ++,为什么不使用std::stringboost::scoped_ptr boost::scoped_array和他们的朋友?

答案 1 :(得分:1)

  

大多数时候,我看到只有MakeString()完成后才会调用MemRelease的析构函数。那样就好。总是这样吗?

是的,永远。在newstr的分配完成之前,临时对象保持有效。

正如afriza指出的那样,我们无法验证哪些销毁代码正在运行,因为您没有包含构造函数array_yesnorelease_yesno的默认值。顺便说一句,有一种名为bool的类型,应该用于是/否值。