动态分配数组时的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 [] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用new运算符动态分配一个长度为n的整型数组

怎么使用new操作符创建动态数组?

c++中的new()申请二维数组

c++中new和delete的用法

C++ 对象的动态建立 & 释放

new和malloc的区别