使用智能指针

don*_*y76 1 c++ c++11

我正在使用具有以下功能的旧版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,因此上述方法不起作用。

我的目标是:

  1. 使用C ++ 11智能指针可以在对现有应用程序进行最少代码更改的情况下实现此目的。

我知道的另一种方法是在调用场所本身中动态初始化数组,然后在该作用域结束之前将其删除。但是我想在回到传统的C ++方式之前探索新的C ++功能。顺便说一句,我目前对探索不感兴趣std::string

Lig*_*ica 6

你可以:

  • 返回 shared_ptr
  • 返回一个 std::string
  • 保留一切

这些是您的选择。

  • 是的,或者我想 (2认同)