动态分配数组时的C ++ new vs new [] [重复]
Posted
技术标签:
【中文标题】动态分配数组时的C ++ new vs new [] [重复]【英文标题】:C++ new vs new[] when dynamically allocating arrays [duplicate] 【发布时间】:2017-08-03 15:11:47 【问题描述】:在 C++ 中,我的理解是 new 应该用于动态分配单个变量,而 new[] 应该用于动态分配变量数组。
但是,以下代码在 Xcode 中编译并运行良好:
#include <iostream>
int main()
std::cout<<"Enter length of array: ";
int length;
std::cin>>length;
int *mArray = new int;
for(int i=0;i<length;++i)
mArray[i] = i;
for(int i =0;i<length;++i)
std::cout<<mArray[i]<<std::endl;
delete mArray;
return 0;
为什么会这样?如果它正在访问尚未分配的内存,它不应该导致程序崩溃吗?
【问题讨论】:
您的写作和阅读超出了界限。如果它工作正常,你很幸运,这段代码有未定义的行为。 如果代码编译,那并不意味着它是正确的(参见未定义的行为)。 这就是使用指针管理与使用std::vector
相比的危险。
不是 100% 相同(代码方面)但非常接近:***.com/questions/1239938/…
未定义行为是未定义。有时你很不走运,但似乎一切正常。
【参考方案1】:
为什么会这样?如果它正在访问尚未分配的内存,它不应该导致程序崩溃吗?
这是 C++ 速度和灵活性的代价 - 许多形式可能会观察到未定义的行为,其中一些看起来确实像您的程序正常工作。问题是这次它似乎“工作”了,下次可能会失败。或者明天当您更新编译器等时。您的工作是不要越界访问内存,而不是编译器来阻止它。尽管某些编译器/环境可能会提供额外的验证,从而使此类访问以一种方式失败,但 C++ 语言不需要它,因此您不能期望默认或根本就拥有它。
注意:越界访问未验证直接内存访问(在这种情况下通过原始指针),当您使用像 std::vector
这样的对象时,它可能会或可能不会验证边界,这取决于您使用的方法或环境,您应该从文档中学习。
【讨论】:
以上是关于动态分配数组时的C ++ new vs new [] [重复]的主要内容,如果未能解决你的问题,请参考以下文章