C ++处理临时对象和数组的正确方法是什么

时间:2017-12-22 19:05:59

标签: c++

最近我读了很多关于排序算法的内容,我发现这个奇怪的东西让我感到困惑。 在函数中,它需要在for循环中创建一个临时数组。 示例代码是

for(;;)//ignore the condition
{
    int *b = new int[N];
    //some code
    delete b[];
}

问题是:为什么不在没有new运算符的情况下直接创建它,因为编译器会自动销毁它并在每次迭代后释放内存。就像在循环中写这个

int b[N];

在前面,我总是使用这个方法来创建临时类型/对象。我完全错了或类似数组的东西与内置类型不同?

那么,Stack Overflowers,有人能给我一些建议吗?

3 个答案:

答案 0 :(得分:5)

  

为什么不直接在没有new运算符的情况下为编译器创建它   将自动销毁它并在每次之后释放内存   迭代。

确实,为什么不呢?

如果在编译时知道N,那么请继续使用int b[N]

如果在编译时不知道N,则应使用std::vector<int>代替:

for(;;)//ignore the condition
{
    std::vector<int> b(N);
    //some code
}

你应该向作者询问他或她使用new[]delete[]的原因,但可能只是缺乏经验。

答案 1 :(得分:3)

如果在编译时已知N,则使用

int b[N];

很好。如果您能够使用C ++ 11编译器,则使用std::array是另一种选择。

std::array<int, N> b;

如果在编译时不知道N,则使用

int b[N];

是非标准的。它仅受某些编译器的支持作为扩展。

如果在编译时不知道大小,请使用std::vector而不是在应用程序代码中管理动态分配的内存。没有明智的理由不使用std::vector

for(;;)//ignore the condition
{
    std::vector<int> b(N);
    //some code

    // No need for this at all.
    // delete b[];
}

答案 2 :(得分:1)

  

为什么不直接在没有new运算符的情况下为编译器创建它   将自动销毁它并在每次之后释放内存   迭代。

根据堆栈的大小和临时数组的大小,您可能希望使用动态内存创建数组,这样就不会破坏堆栈(堆栈内存耗尽)。

当然,矢量是一个比阵列更好的选择,因为它已经被提到过了。