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

问题描述 投票:2回答:3

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

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

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

int b[N];

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

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

c++
3个回答
5
投票

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

的确,为什么不呢?

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

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

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

您应该向代码的作者询问为什么他或她使用new[]delete[],但可能只是缺乏经验。


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[];
}

1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.