有没有办法区分new和new[]的返回值?

Is there a way to distinguish between new's and new[]'s return value?

本文关键字:new 返回值 法区 有没有      更新时间:2023-10-16

考虑以下代码:

int *p = new int;
cout << sizeof(*p);
delete p;

不出所料,结果是4。现在,考虑另一个代码:

int *p = new int[10];
cout << sizeof(*p);
delete[] p;

我期望得到40(分配的数组的大小),但是结果仍然是4

现在,假设我有一个函数int *foo(),它返回一个指向用newnew[]创建的结构的指针(但我不知道是哪一个):

int *p = foo();

我的问题是,有没有办法(或破解)知道p是指向单个整数还是指向整数数组?

请记住,这只是一个理论问题。我不会以这种方式编写真正的代码

不,没有办法做到这一点。但是知道区别,因为您编写的代码称为newnew[]

原因是:

 cout << sizeof(*p);

在这两种情况下都给你4是因为p是一个指向int的指针,表达式*p表示这样一个指针所指向的东西(即int),而在你的平台上int的大小是4。这一切都是在编译时计算的,所以即使new[]确实返回了一个特殊值,sizeof也无法使用它

否,因为结果是一个地址(这就是为什么在这两种情况下sizeof()都得到4的原因)。你创建了它,所以你应该知道它是什么。

在这两个例子中,p的类型是相同的:int*。sizeof操作的是类型,而不是数据。它是在编译时计算的。

你有几个选择。您可以自己跟踪数组大小,也可以冒险使用标准库中的一个容器,例如vector<int>。这些容器将为您跟踪大小(例如vector<int>::size())。

sizeof(x)返回包含声明的x所需的内存量。

这根本没有任何动态方面。

sizeof(*foo)其中foo是bar *将始终与sizeof(bar) 相同

不,没有任何办法。

强制性问题:为什么你需要知道?

如果是"因为我需要知道是说delete []还是delete",那么就一直使用数组,如果出于某种模糊的原因,你无法确定在自己的代码中使用了哪一个。

拥有一个可以返回指向单个项或数组的指针的函数是一个糟糕的设计决策。您总是可以返回一个指向1:大小数组的指针

return new int[1];

首先,sizeof(*p)总是向整数返回一个值,因此它总是返回4

现在,您如何知道p是指向int还是指向int[]

没有标准的方式。但是,你可以破解平台并让它出名。例如,如果您尝试为某些编译器打印p[-1], p[-2], ..., p[-4] etc.(在我的例子中是linux),那么您将在这些位置的值中看到一个特定的模式。然而,这只是一个黑客,你不能总是依赖它。