2

我有以下指针。

char **x = NULL;

x is 将指向一个指针数组。那么下面的代码正确吗?

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

我们将使用

delete[] x;

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

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

相等的?

4

4 回答 4

7

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

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

于 2009-07-14T07:10:19.443 回答
4

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

char*

不是:

*char

奇怪的是,您在“C 风格”示例中使用malloc(),但在 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 中,你永远不应该那样做。
于 2009-07-14T07:09:01.677 回答
2

新是在 C++ 中引入的。Malloc 是 C.

你不应该混合和匹配它们......即不要在你使用过malloc的东西上使用delete。检查这篇文章。

于 2009-07-14T07:13:57.250 回答
1

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

于 2009-07-14T10:03:01.153 回答