考虑以下代码:
int *p = new int;
cout << sizeof(*p);
delete p;
正如所料,结果为4.现在,请考虑其他代码:
int *p = new int[10];
cout << sizeof(*p);
delete[] p;
我希望得到40(分配数组的大小),但结果仍为4 。
现在,假设我有一个函数int *foo()
,它返回一个指向使用new
或new[]
创建的结构的指针(但我不知道哪一个):
int *p = foo();
我的问题是,有没有办法(或黑客)知道p
是指向一个整数还是一个整数数组?
请记住,这只是一个理论问题。我不会以这种方式编写真正的代码。
答案 0 :(得分:4)
不,没有办法做到这一点。但你知道区别,因为你写的代码叫new
或new[]
。
顺便说一下的原因:
cout << sizeof(*p);
在两种情况下,给出4是因为p是指向int的指针,表达式* p表示由这样的指针指向的东西(即int),并且平台上int的大小为4。在编译时进行全部评估,因此即使new[]
确实返回特殊值,sizeof
也无法使用它。
答案 1 :(得分:3)
不,因为你的结果是一个地址(这就是为什么你在两种情况下得到4的sizeof())。你创造了它,所以你应该知道它是什么。
答案 2 :(得分:2)
在两个示例中,p的类型相同:int *。 sizeof对类型进行操作,而不是数据。它是在编译时计算的。
你有几个选择。您可以自己跟踪数组大小,也可以尝试使用标准库中的一个容器,例如vector&lt; int&gt;。这些容器将为您跟踪大小(例如vector&lt; int&gt; :: size())。
答案 3 :(得分:2)
sizeof(x)返回声明包含x所需的内存量。
根本没有动态方面。
sizeof(* foo)其中foo是bar *
将始终与sizeof(bar)
答案 4 :(得分:1)
不,没有办法。
强制性问题:你为什么需要知道?
如果是“因为我需要知道是否要说delete []
或delete
”,那么就一直使用数组,如果由于某些不明原因你无法弄清楚你使用的是哪一个在你自己的代码中。
答案 5 :(得分:1)
拥有一个可以返回指向单个项目或数组的指针的函数是一个糟糕的设计决策。您始终可以返回指向大小为1的数组的指针:
return new int[1];
答案 6 :(得分:0)
首先,sizeof(*p)
始终返回整数值,因此它始终返回 4 。
现在,您怎么知道p
是指向int
还是int[]
?
没有标准方式。但是,您可以破解该平台并将其公之于众。例如,如果您尝试为某些编译器打印p[-1], p[-2], ..., p[-4] etc.
(比如我的情况下就是linux),那么您将在这些位置的值中看到特定的模式。然而,这只是一个黑客,你不能总是依赖它。