在堆上分配内存时防止数组衰减?

rb6*_*612 3 c++ arrays pointers

如果我写int* a = new int[5];,然后我打电话sizeof(a)sizeof(*a),我没有得到我想要的信息,因为数组已经衰变为指针.但是,我想知道我们是否有办法做这样的事情:

int[5]* a = new int[5];

我很确定我们能够用堆栈内存做到这一点,但我不确定是否有任何方法可以为堆内存执行此操作,因为以上内容无法编译.如果没有办法,有没有理由不这样做?

pax*_*blo 5

C++最初只是C的前端,并且因此从原始语言中带来了相当多的包袱.比如<cXXX>标题中的很多东西,以及许多操作的行为,比如数组衰减(a).

如果你想要一个更方便的数组类型,C++ 就有这样的野兽std::vector.如果你传递它,你将不会受到使用更低级别内存分配方法时可能看到的衰减的影响.例如,见:

#include <iostream>
#include <vector>

void someFunction (const std::vector<int> &myVec) {
    std::cout << myVec.size() << std::endl;
}

int main() {
    std::vector<int> myVec({ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 0 });
    std::cout << myVec.size() << ' ';
    someFunction(myVec);
}
Run Code Online (Sandbox Code Playgroud)

哪个输出13 13,显示函数外部和内部的大小相同(它也是元素的大小而不是给定bt的字节sizeof,前者通常是一个更有用的度量).


在指导或培训C++程序员时,我总是警告他们成为一名"C +"程序员,一个在C上长大并且从未真正完全过渡到C++的人(比如继续使用原始数组而不是向量,滚动自己的数据)当完全足够的结构在标准库中时,使用malloc/freeprintf等等).

你会明智地将C和C++视为相关但完全不同的语言,并尽可能采用C++思维方式.


(a)中有趣的是,您的具体问题并没有有一个数组衰变成一个指针.该new调用实际上直接返回一个指针,因此不会涉及衰减.

在哪里你看到衰变是这样的:

void someFunction (int x[]) {
    // Pointer to first element here, size is int-pointer-size.

    std::cout << sizeof(x) << std::endl;
}

:

// Array here, size is 13 * int-size.

int xyzzy[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 0 };
std::cout << sizeof(xyzzy) << std::endl;

someFunction(xyzzy);
Run Code Online (Sandbox Code Playgroud)