为什么这段代码可以工作

Why this code work?

本文关键字:工作 代码 段代码 为什么      更新时间:2023-10-16
#include <iostream>
#include <string>
using namespace std;

class CExample {
public:
  int a,b,c;
  void setvalue(int n, int m);
  void multiply() { 
  c = a*b;
  cout<< c <<endl;
  };
};
void CExample::setvalue(int n, int m){
  a = n; b = m;
}
int main( )
{
  CExample *d = new CExample[1];
  d[0].setvalue(2,30);
  d[0].multiply();
  d[1].setvalue(2,30);
  d[1].multiply();
  d[2].setvalue(2,30);
  d[2].multiply();
  delete[] d;
  return 0;
}

由于我只为数组d分配了1个内存资源,所以在操作d[2]时应该会遇到错误。但是,编译器没有报告错误或警告。结果是正确的。

有人能解释一下为什么它有效吗?

感谢

是的,这就是未定义行为的魔力。谢谢大家。

c++编译器不能也不会捕获所有可能的错误代码。

在运行时,c++程序通常不会在越界访问内存时抛出错误。这种语言不是为了保护程序员不做坏事而设计的。

所以当一个程序做这样的事情时…这是未定义行为…任何事情都有可能发生。这个"任何东西"可以包括看起来工作"正确"。或者奇怪的行为可能马上就会出现。但无论哪种方式都是错误的。如果它看起来有效,那只是运气。

在实践中,它也可能在某处破坏内存,最终导致其他问题。也许这些问题没有时间在小的示例程序中表现出来。但是程序越大,出现某种不良症状的可能性就越大。

最后,c++让程序员有很大的责任来编写正确的代码,而不做诸如超出数组边界之类的事情。

"谁能解释一下它为什么有效?"——你相信代码是有效的。

"I should to encounter error when manipulation d[2]"——你认为代码应该做一些它不应该做的事情。

你提出了两个相互矛盾的主张。你是在说代码可以工作,而且它应该做一些它所做的以外的事情。

如您所知,您的代码有一个错误。

  1. 你在一个未分配内存上操作,这是一个未定义的行为。
  2. 这是一个运行时错误,所以编译器不能捕获它。使用valgrind,一个内存检查工具,你会得到"Invalid write"错误。