【发布时间】:2020-06-19 01:57:12
【问题描述】:
我想知道sizeof 运算符和delete[] 如何知道他们正在操作的数组的实际大小,但是当我将数组作为参数传递给函数时,大小信息会丢失,并且大小信息需要程序员显式传入函数吗?
导致这种差异的内部机制是什么?
#include <iostream>
void my_function(int* p, int n) {
std::cout << "when passed into a function as argument, array size information is not available" << std::endl;
}
int main() {
int a[] = { 1, 2, 3 };
std::cout << "sizeof(a): " << sizeof(a) << std::endl; // size information available to `sizeof` operator
int* b = new int[3] {1, 2, 3};
delete[] b; //size information available to `delete[]` operator
int c[] = { 1, 2, 3 };
my_function(c, 3);
return 0;
}
【问题讨论】:
-
是什么让您认为代码中
b指针的“大小信息可用”?它可能(必须)内部对系统的内存分配器可用,但尝试显示一些代码,您可以在其中从指针本身获取b数组的大小solely (例如,如果您将 that 指针传递给另一个函数)。 -
我的意思可能还没有完全说清楚,在使用
delete[]的时候,数组大小信息对程序员是不可用的,但是delete[]可以使用,delete[]可以这样释放分配给数组的内存,对吧? -
是的!就像
malloc返回的指针一样(它甚至可以用于实现new[]运算符)。对于您的 C++ 代码,它只是一个地址;对于系统来说,它是一个地址,它在某处/以某种方式被索引到系统范围内存管理器的已分配块列表中。 -
所以
delete[]运算符可以使用大小信息,但为什么不能为作为参数传递给函数的数组提供相同的信息? -
delete[]运算符不可用。它可用于该运算符的特定于系统的实现。 C++ 中的指针只是 一个地址。将这样的指针传递给函数不会向该函数传达有关数据块大小的任何信息,无论该指针来自new[]、malloc还是用户声明的固定数组的地址。它仍然只是一个指针。