我能告诉C++中用"new type [n]"创建的数组的大小吗?

Tho*_*ann 8 c++ c++11

使用C++ 11,我喜欢创建一个布尔数组并立即清除它

bool *mymap = new bool[n];
Run Code Online (Sandbox Code Playgroud)

n是可变的.

现在,这已经清除了阵列占用的内存吗?如果没有,是否有更好的方法来清除数组,而不是在所有元素上使用循环,将每个元素分别设置为false?

我考虑使用std:memset(),但这需要我知道数组的大小.现在,初学者可能会说:容易,大小是n*sizeof(布尔).但我不买.编译器可能决定以不同方式打包它们,甚至将它们打包为位,不是吗?

那么,有没有办法更清晰地告诉阵列的大小?我想可能有一个std:arraysize()函数,它只返回内存中已分配数组的空间.毕竟,必须以某种方式在运行时维护该信息,否则删除调用将不知道要释放多少,对吧?

jua*_*nza 10

具体问题的答案是否定的,你无法确定指向的数组的长度mymap.该语言根本没有提供任何机制.

但是如果您要做的就是确保将数组的所有元素都设置为false,那么您所要做的就是将值初始化:

bool* mymap = new bool[n]();
//                       ^^
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅适用于内置类型的零值.没有相同的方法来设置所有值true.

  • 或者你可以使用统一初始化:`new bool [n] {}`,`new bool [n] {true,false,true}`等. (2认同)

Ser*_* K. 6

你不能以标准的方式做到这一点.但是,不同的编译器支持不同的黑客攻击,例如:

#if defined(_MSC_VER) || ( defined(__GNUC__) && defined(_WIN32) )
      // a dirty MSVC and MinGW hack
      size_t Size = _msize( mymap );
#elif defined(__GNUC__)
      // a dirty glibc hack  
      size_t Size = malloc_usable_size( mymap );
#else
   #error Implement for any other compiler
#endif      
Run Code Online (Sandbox Code Playgroud)

但这些都是真正的黑客,所以要小心.

顺便说一句,std::vector可以帮助您在标准内解决您的问题.