C++ 如何返回堆分配的 c 字符串而不用担心在使用后释放它?

问题描述 投票:0回答:2
char *getPtrA()
{

   char *temp = (char*) malloc(len);
   
   strcpy(temp, "something");
   std::shared_ptr<std::string> var1 = std::make_shared<std::string>();
   var1->assign(temp);
   free(temp);

   return var1->c_str();

}

int main()
{
      char *mypointer = getPtrA();
      
      printf(stderrr, "content of ptrA = %s\n", mypointer);
}



上面的代码有意义吗?我想做的是让从堆中分配的 c 字符串在 GetPtrA 函数中被释放,但是一旦退出,var1 中的内存就会自动管理,而不会导致内存泄漏。

不确定是否有优雅的方式来做到这一点。我实际上想做的是不要担心调用者在完成它后释放“临时”。

感谢任何提示。

尝试使用分配给 shared_ptr。不确定它是否有效。

c++ heap-memory
2个回答
2
投票

上面的代码有意义吗?

没有。一旦

var1
超出范围,
shared_ptr
的析构函数将意识到它是
std::string
的唯一所有者,因此调用它的析构函数。这反过来会破坏你返回的指针指向的内存。

此外,您破坏了常量正确性,因为

c_str()
返回
char const*
,而不是
char*

实际上我想做的是不要担心调用者在完成它后释放“临时”。

然后返回一个

std::string
。无法自行返回
char*
,一旦“调用者”“完成它”,它就会神奇地消失。

你必须使用一个真实的对象,一个真正管理字符串生命周期的构造函数和析构函数。如果你想“不用担心”,你必须停止返回指向事物的原始指针。


0
投票

您需要将创建和删除操作包装在一个具有构造函数和析构函数的类中。当心!有很多内存陷阱。您将在学习 C++ 的同时学习这些内容。另请注意,您也可以利用许多预定义的类:字符串就是其中之一。尽量减少重新发明轮子。

© www.soinside.com 2019 - 2024. All rights reserved.