【问题标题】:Lifetime of a C++ object defined inside a function [duplicate]在函数内定义的 C++ 对象的生命周期 [重复]
【发布时间】:2017-07-02 06:42:38
【问题描述】:

我是一名 Java 程序员,我是 C++ 新手,最近我一直在编写一些 C++ 代码。 我对 C++ 对象的生命周期有点困惑(在 Java 中有垃圾收集,我不必担心这个问题)。

这是我的问题。 假设我有一个函数f()

char *f() {

  string a = "Hello";

  return a.c_str();

}

此代码有效吗?让我困惑的是:f 内部声明的字符串a 的生命周期是多少,当f 返回时它会被垃圾回收吗?我可以依靠返回的a.c_str()f 之外正确吗?

【问题讨论】:

  • C++ 中没有垃圾回收。
  • 我可以依靠返回的 a.c_str() 在 f 之外正确吗? 不能。
  • 真的没必要用C风格的char*。如果您简单地返回std::string,您的问题就会完全消失,它会正确管理其内容。如果您确实需要将char* 传递给某物,请尽可能靠近它使用c_str。顺便说一句,c_str 给了你一个const char*,所以试图忽略它的 constness 是行不通的。
  • 您可以在堆上分配“Hello”字符数组并返回一个shared_ptr。或者更好的是,按值返回 std::string。

标签: c++ object scope


【解决方案1】:

C++ 没有像 java 那样的垃圾收集器。如果您创建一个对象,那么您需要自行销毁它。函数中定义的所有变量都将在退出该函数时销毁(对象除外,您需要自己销毁)

【讨论】:

  • “对象除外,需要你自己销毁”这样说不通,也不对。
  • 为什么?对象* o = 新对象();我应该忘记这个对象吗?
  • int i; 现在i 也是一个对象。你的术语完全不适用。
  • i 是一个变量,而不是一个对象。你不应该删除它,但如果你写 int* i = new int;你应该在退出函数之前删除 i。
  • 在 Java 变量中,如 Integer 或 String 或 Double 是对象,因为它们有方法。但是如果你写 Integer i = new Integer(1) 你不应该像在 c++ 中那样删除它
猜你喜欢
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多