没有new运算符的动态数组?

时间:2013-02-20 20:51:09

标签: c++ arrays memory-management

什么时候这个语法有效? (使用g ++ 4.6.3工作) 我应该搜索什么以找到关于此的更多信息(我习惯于新/删除)?

#include <iostream>

int main(){
    size_t sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    float dynamic_arr[sz];

     //output the (uninitialized) value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
     return 0;
}

2 个答案:

答案 0 :(得分:8)

Varialbe长度数组(VLA)不是标准C ++,它们是编译器扩展。如果您希望代码可移植,则不应使用它。

如果使用-Wvla -Werror标记或-Werror=vla进行编译,则代码将产生错误

  

错误:使用可变长度数组'dynamic_arr'[-Werror = vla]

答案 1 :(得分:1)

标准C ++不支持C99和g ++的可变长度数组(VLA)。

在标准C ++中,您可以使用例如 std::vector ,就像这样(您的代码已修改):

#include <iostream>
#include <vector>

int main(){
    int sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    std::vector<double> dynamic_arr( sz );    // Initialized to zeroes.

     //output the value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
}

此外,对于字符串,您可以使用 std::basic_string ,通常是typedef s std::stringstd::wstring

一般来说,主要问题只是动态大小,如上所述,然后std::vectorstd::basic_string可以很好地完成工作。但是,有时问题是效率,如何进行动态大小数组的极其高效的堆栈分配。许多C和C ++实现支持非标准函数 alloca ,但遗憾的是它们在处理失败方面有很大差异。据我所知,也没有常见的库解决方案。但幸运的是,我所知道的主要用法(尽管提到alloca可用于许多平台)已经用于Windows中的字符串编码转换,并且随着时间的推移越来越不相关on和Windows程序越来越多地是纯粹面向Unicode的。