我们的代码类似于下面的代码。我们正在尝试使用一个名为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;
}
答案 0 :(得分:3)
而不是使用delete
,请使用delete[]
因为您使用new []分配内存。
由于您使用的是C ++,为什么不使用std::string
或boost::scoped_ptr
boost::scoped_array
和他们的朋友?
答案 1 :(得分:1)
大多数时候,我看到只有MakeString()完成后才会调用MemRelease的析构函数。那样就好。总是这样吗?
是的,永远。在newstr
的分配完成之前,临时对象保持有效。
正如afriza指出的那样,我们无法验证哪些销毁代码正在运行,因为您没有包含构造函数array_yesno
和release_yesno
的默认值。顺便说一句,有一种名为bool
的类型,应该用于是/否值。