我有以下指针。
char **x = NULL;
x is 将指向一个指针数组。那么下面的代码正确吗?
x = new (nothrow) (*char)[20];
我们将使用
delete[] x;
是
x = (char **) malloc(sizeof(char **) * 20);
和
x = new (nothrow) (*char)[20];
相等的?
我有以下指针。
char **x = NULL;
x is 将指向一个指针数组。那么下面的代码正确吗?
x = new (nothrow) (*char)[20];
我们将使用
delete[] x;
是
x = (char **) malloc(sizeof(char **) * 20);
和
x = new (nothrow) (*char)[20];
相等的?
除了 unwind 提到的指针语法之外,它是等价的:在这两种情况下都会分配和删除一个 20 char* 的数组。
C++ 熟练警告:std::vector< std::string >
改用 :) 不需要内存管理。
不,该代码有语法错误。星号在类型名称之后,形成指向该类型的指针。所以这是:
char*
不是:
*char
奇怪的是,您在“C 风格”示例中使用malloc()
,但在 C++ 中却没有。
正如许多评论者所指出的那样,尽管如此,malloc()
以及它的使用还存在其他问题。sizeof
但至少它的类型名称是正确的。就我个人而言,如果可能的话,我反对在malloc()
调用中重复类型名称,所以我会像这样编写那个版本,以分配一个由 20 个字符指针组成的动态数组:
char **x;
x = malloc(20 * sizeof *x);
这边走:
x
点大小的 20 倍”,即单个char *
指针大小的 20 倍。wchar_t **x
这仍然可以工作,而不是偶然。malloc()
. 在 C++ 中,您需要转换返回值。在 C 中,你永远不应该那样做。新是在 C++ 中引入的。Malloc 是 C.
你不应该混合和匹配它们......即不要在你使用过malloc的东西上使用delete。检查这篇文章。
我会质疑你为什么首先分配这样的东西。在 C++ 中,std::string 的 std::vector 更可能是您需要的。