有没有办法区分new和new[]的返回值?
Is there a way to distinguish between new's and new[]'s return value?
考虑以下代码:
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
是指向单个整数还是指向整数数组?
请记住,这只是一个理论问题。我不会以这种方式编写真正的代码
不,没有办法做到这一点。但是您知道区别,因为您编写的代码称为new
或new[]
。
原因是:
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),那么您将在这些位置的值中看到一个特定的模式。然而,这只是一个黑客,你不能总是依赖它。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 我可以从取消引用"new"的返回值初始化引用吗
- 放置 new 的返回值与其操作数的强制转换值之间是否存在(语义)差异
- 重载不同返回值的运算符new
- 重载new返回的值与this不匹配
- 有没有办法区分new和new[]的返回值?