【问题标题】:Dealing with chars in C++ (without std::string)在 C++ 中处理字符(没有 std::string)
【发布时间】:2010-11-20 19:21:33
【问题描述】:

我有这个代码:

char* value = "abcdefg";

char* secondValue = value;

第二个值将获得值的地址好吗?如果我删除“值”,那么 secondValue 将不可用,对吗?

所以我应该这样做:

char* value = "abcdefg";
secondValue = new char[strlen(value)];
strcpy(secondValue, value);

所以如果我删除“值”没问题。

最后释放我应该做的 secondValue:

delete[] secondValue;

我说的对吗?

【问题讨论】:

  • 您的问题被标记并命名为 C,但 delete 是 C++ 语法。你的问题有点混乱。
  • 新建/删除?那是C++。也许你应该看看 std::string。
  • 好的,我将更改标题,我无法访问我正在使用的组件上的标准内容。
  • @okami:为什么不呢?无论如何,重新制作它。
  • 您应该将char* 替换为const char*。原因已概述here

标签: c++ arrays char dealloc


【解决方案1】:

你写的有两个问题:

  1. 您不能删除char *value = "abcdefg";,因为它没有在堆上分配。 要分配堆内存,请使用 new(C++ 中)或 malloc(C 中)。

  2. 当你为一个字符串分配内存时,你总是需要一个额外的字节来终止空值。

在你的情况下,你应该这样做:

secondValue = new char[strlen(value)+1];

除此之外,你是对的

【讨论】:

    【解决方案2】:

    如果您使用的是 C++,那么您是正确的,只是您需要将 secondValue 增大一个字符:

    secondValue = new char[strlen(value) + 1];
    

    C 风格的字符串以'\0' 字符结尾,这也需要存储空间。

    如果您使用 C 而不是 C++,则没有 newdelete[],您必须使用函数 malloc()free() 代替:

    secondValue = malloc(strlen(value) + 1);
    ...
    free(secondValue);
    

    无论如何请注意,在示例中value 是一个字符串文字,不能被删除/释放。您应该只删除/释放您分别使用 new/malloc 分配的内容。

    【讨论】:

      【解决方案3】:

      您编写代码的方式:

      char* value = "abcdefg";
      

      编译器将生成一个静态字符串"abcdefg"value 将是一个指向它的指针。您可以分配secondvalue = value,然后让value go out of scope, andsecondvalue` 仍然有效。

      在您的示例中,没有其他方法可以释放 value

      【讨论】:

      • 所以如果 char* 值 = "abcdefg";是内部结构,如 struct { char* value; } 我的结构;即使我删除 MyStruct 类型的对象,“值”数据也将是静态数据?
      • 是的,如果你用静态常量初始化了value
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多