我正确使用新操作员吗?

时间:2009-07-14 07:06:52

标签: c++ new-operator

我有以下指针。

char **x = NULL;

x将指向一个指针数组。以下代码是正确的吗?

x = new (nothrow) (*char)[20];

我们将使用

处理它
delete[] x;

x = (char **) malloc(sizeof(char **) * 20);

x = new (nothrow) (*char)[20];

等效?

4 个答案:

答案 0 :(得分:7)

除了unwind提到的指针语法之外,它是等价的:在两种情况下都会分配和删除20个字符*的数组。

C ++ - 熟练的警告:改为使用std::vector< std::string > :)不需要内存管理。

答案 1 :(得分:4)

不,该代码存在语法错误。星号在类型名称之后,以形成指向该类型的指针。所以它是:

char*

*char

在使用malloc()的“C风格”示例中有这个权利,但在C ++中没有这个权利,这很奇怪。

正如许多评论者已经指出的那样,malloc()还有其他问题及其对sizeof的使用。但至少它的类型名称是正确的。就个人而言,如果可能的话,我反对在malloc()调用中重复类型名称,所以我会像这样写这个版本,以分配一个包含20个字符指针的动态数组:

char **x;

x = malloc(20 * sizeof *x);

这样:

  1. 应该被理解为“是x点数的20倍”,即单个char *指针大小的20倍。
  2. 仅在一个地方包含魔法常数20.
  3. 不重复此类型的任何部分,如果您要更改为wchar_t **x,这仍然有效,而不是偶然。
  4. 用C语写,因为我觉得在讨论malloc()时更自然。在C ++中,您需要转换返回值。在C中,你永远不应该这样做。

答案 2 :(得分:2)

在C ++中引入了New。 Malloc是C。

你不应该混合和匹配它们...即不要在你使用过malloc的东西上使用删除。查看this文章。

答案 3 :(得分:1)

我问你为什么要首先分配这样的东西。在C ++中,std :: string的std :: vector更可能是你需要的。