我正在使用具有以下功能的旧版C ++应用程序,
char* CreateNewString (const char* node)
{
int len = (int) strlen(node) + 1;
char * ptr = new char [len];
strcpy_s(ptr, len, node);
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
该函数从应用程序的许多类中调用,这是一个用例示例。
char * nodeID = obj.CreateNewString(process->GetNodeID());
Run Code Online (Sandbox Code Playgroud)
该应用程序调用一个不同的进程,并获得一个节点ID作为char指针,然后将其传递给CreateNewString函数,以便为新字符串动态分配内存。
在上述调用之后,应用程序中无处删除内存。据我观察,这里确实存在内存泄漏。
我认为解决此问题的方法很少。但是我想先尝试在C ++ 11中使用智能指针,然后再尝试其他方法。
我试过的
所以我想出了以下功能:
char* CreateNewString (const char* node)
{
int len = (int) strlen(node) + 1;
shared_ptr<char> ptr (new char [len](), [](char* p) {delete [] p;});
strcpy_s(ptr.get(), len, node);
return ptr.get();
}
Run Code Online (Sandbox Code Playgroud)
目的是使函数签名保持不变,即它返回一个char指针,这样我就不必在所有调用位置进行更改。
由于在函数的范围内声明了ptr,因此上述方法不起作用。
我的目标是:
我知道的另一种方法是在调用场所本身中动态初始化数组,然后在该作用域结束之前将其删除。但是我想在回到传统的C ++方式之前探索新的C ++功能。顺便说一句,我目前对探索不感兴趣std::string。
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |