Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;什么&x2019;这是处理临时对象和数组的正确方法_C++ - Fatal编程技术网

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

C++ C++;什么&x2019;这是处理临时对象和数组的正确方法,c++,C++,最近我读了很多关于排序算法的书,我发现了一些奇怪的东西,这让我感到困惑。 在函数中,它需要在for循环中创建一个临时数组。 示例代码是 for(;;)//ignore the condition { int *b = new int[N]; //some code delete b[]; } 问题是:为什么不直接创建它而不使用新操作符,因为编译器会自动销毁它,并在每次迭代后释放内存。就像在循环中写这个一样 int b[N]; 在前面的例子中,我总是使用这个方法来创建临

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

for(;;)//ignore the condition
{
    int *b = new int[N];
    //some code
    delete b[];
}
问题是:为什么不直接创建它而不使用新操作符,因为编译器会自动销毁它,并在每次迭代后释放内存。就像在循环中写这个一样

int b[N];
在前面的例子中,我总是使用这个方法来创建临时类型/对象。我是完全错了还是数组和内置类型不同

那么,善良的堆栈溢出者,有谁能给我一些建议吗

为什么不直接为编译器创建它而不使用新操作符呢 将自动销毁它并在每次之后释放内存 迭代

事实上,为什么不呢


如果编译时已知
N
,则继续使用
intb[N]

如果编译时不知道
N
,则应改用
std::vector

for(;;)//ignore the condition
{
    std::vector<int> b(N);
    //some code
}
(;;)//忽略该条件 { std::载体b(N); //一些代码 }
你应该问代码的作者为什么要使用
new[]
delete[]
,但很可能是因为缺乏经验。

int b[N];
很好。如果您能够使用C++11编译器,那么使用
std::array
是另一种选择

std::array<int, N> b;
这是不标准的。它仅作为扩展由某些编译器支持

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

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

    // No need for this at all.
    // delete b[];
}
(;;)//忽略该条件 { std::载体b(N); //一些代码 //根本不需要这个。 //删除b[]; } 为什么不直接为编译器创建它而不使用新操作符呢 将自动销毁它并在每次之后释放内存 迭代

根据堆栈的大小和临时数组的大小,您可能希望使用动态内存创建数组,以避免耗尽堆栈(堆栈内存不足)


当然,向量是比数组更好的选择,正如前面所提到的。

假设N不是常数,则不能。但是您肯定应该使用std::vector而不是pointer和new。请注意:如果在编译时不知道N,GCC将乐于接受这一点,因为它支持VLAs(可变长度数组),但是,许多编译器不支持(如MSVC)。你应该像其他建议一样使用一个向量,除非你不担心可移植性。从技术上讲,您可以使用
alloca()
获得类似VLA的支持,但您真的不应该这样做。@AlexanderHuszagh GCC会乐意接受这一点,如果在编译时不知道N,-IMO,它真的不应该乐意接受它,除非程序员通过命令行请求它。我不明白为什么gcc和其他编译器会默认使用VLA。它让新程序员相信他们正在编写有效的C++代码。我总是想知道,为什么GCC会因为糟糕的默认设置而逍遥法外,而MSVC却因此受到批评。这似乎不公平。除非有其他的消息,否则每个C++编译器都应该严格遵守标准。尽管它不是标准C++,但重要的是要知道它是一个C99扩展,而不是一个黑客,重要的是要注意,即使在编译时不知道代码> N>代码>,编译器也允许使用代码> int b[n] < />代码。但这是一个非标准的扩展,不是标准的c++实际上,如果使用了适当的编译器标志,编译器不允许使用它。这是我对那些编译器的抱怨之一——默认情况下他们不应该允许这样做。谢谢你的回答。解决了我的问题。代码来自visualgo.net,我想在排序算法学习过程中不建议使用STL。@balki:但如果我这样做了,我必须一直解释,当我解释临时对象时,有些编译器允许将临时对象绑定到非常量引用,或者有些编译器允许
void main
。我不想给人留下GCC默认行为正常或良好的错误印象。@Shawnzu:这是标准库,不是“STL”,但这是一个吹毛求疵的地方。更重要的是,我认为学习算法和学习C++容器是独立的主题。第一个是计算机科学,第二个是软件工程。如果
N
很大,那么堆栈大小的好处是,我完全忘了在回答中提到这一点+从我这里得到1。
for(;;)//ignore the condition
{
    std::vector<int> b(N);
    //some code

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