Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ - Fatal编程技术网

C++ 新运算符分配的大小大于声明的大小。为什么?

C++ 新运算符分配的大小大于声明的大小。为什么?,c++,C++,我正在使用代码块16.01。在下面给出的代码中,我使用了新的运算符和声明的数组指针 #include <iostream> using namespace std; int main() { int *p = new int[2]; for(int i=0; i<10;i++) { cout<<"\n Enter the element "<<i << " : "; cin>>*(p+i);

我正在使用代码块16.01。在下面给出的代码中,我使用了新的运算符和声明的数组指针

#include <iostream> 
using namespace std;
int main()
{
 int *p = new int[2];
 for(int i=0; i<10;i++)
 {   
     cout<<"\n Enter the element  "<<i << " :  ";
     cin>>*(p+i);
 }
 for(int i=0; i<10;i++)
   cout<<"\n"<<*(p+i)<<" :  "<< i << "th element ";
 }

这是我怀疑C++数组元素引用没有根据数组边界自动检查的原因

通常可以引用为数组分配的大小之外的值,但不应该这样做。在分配的数组选择之外,内存可以分配给其他对象


例如,有一些工具可以指导您的程序检测越界访问和其他有问题的操作。它们可以是非常有趣的实验

您为2个整数保留了空间。用指针指向内存中的某个地方。前两次访问命中int数组。最后8次访问只是写在某个地方。
因此,这是一个典型的c问题。在数组外写,破坏一些数据,不要注意…

访问超出数组的末尾是C++标准未定义的行为。作为一名程序员,你的工作就是确保这种情况永远不会发生

<>如果发生了,一个有效的C++程序可以在不违反C++标准的情况下做任何事情;它可以格式化你的硬盘,通过电子邮件将你的浏览器历史记录和信用卡号码发送到南极洲,甚至可以进行时间旅行。有趣的是,最后一个不是笑话

实际上,C++编译器在硬件上提供一个抽象的机器,它是一个基于你的操作系统提供的一个基于页面的内存提供者。C/C++运行时管理一个内存堆,它将操作系统提供的页面分割成您请求的内存块。这意味着您的进程拥有new返回的大多数地址周围的地址空间;通常情况下,返回的块周围的数据包含C/C++运行时的簿记信息,以便在回收地址时使用

通过在那里写入,您将覆盖程序内存空间中的某些其他数据结构,或者使用未声明要写入的内存。在一个更大的程序中,这将非常可靠地导致堆损坏,并在代码的一个意外且看似无关的部分出现看似随机的崩溃。在你的玩具程序中,你损坏的内存没有被使用,因此没有出现明显的症状,而且似乎有效。欢迎来到未定义的行为


所有这一切就是为什么至少在某些情况下,在原始数据中使用new/malloc和指针算法被认为不是一个好主意,而是将其打扮成一种模式,使其不太可能导致堆损坏。像std::vector和基于范围的for循环之类的东西。C/C++程序员无法控制内存访问,导致了几十种非常成功且速度缓慢的语言,它们的主要优点是访问无效指针不是未定义的行为。

访问超越最终定义的行为。任何事情都可能发生。尝试最终删除[]p,您会感到惊讶。数组是常量指针@EduardoPascualAseff,我不知道你在说什么,但是数组和指针是不同的类型。你的例子中没有任何东西表明new操作符分配的内存比请求的多。您的示例只意味着您的代码访问它分配的更多元素,并且您没有看到任何症状。产生这种情况的原因可能是任何原因——例如,在数组外的内存中运行碰巧与其他数据对应的内存,而您的代码或主机系统没有检测到这种情况。如果使用另一个编译器,同一代码的行为可能会完全不同。未定义的行为意味着没有保证。这并不意味着程序应该崩溃。这实际上不是一个典型的c问题。这是一个典型的程序员问题,被归咎于语言,因为程序员更喜欢将错误代码的后果归咎于他们的工具而不是他们自己。此外,调试运行时可能会分配额外的内存来检查程序员是否超出了缓冲区,而不仅仅是为了记录信息。