为什么这段代码可以工作
Why this code work?
#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]"——你认为代码应该做一些它不应该做的事情。
你提出了两个相互矛盾的主张。你是在说代码可以工作,而且它应该做一些它所做的以外的事情。
如您所知,您的代码有一个错误。
- 你在一个未分配内存上操作,这是一个未定义的行为。
- 这是一个运行时错误,所以编译器不能捕获它。使用valgrind,一个内存检查工具,你会得到"Invalid write"错误。
相关文章:
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- C++代码停止工作错误使用cout内部函数
- 我的代码无法正常工作。谁能指出错误?
- 有人可以详细解释这个回文代码是如何工作的吗?
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 代码在Visual Studio 2017中不起作用,但在VS代码中工作
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 添加新行时工作代码引发异常.调试技巧?
- 一个非常简单的win32套接字代码,但工作错误
- 需要WXLISTCTRL的代码更改为虚拟样式WXListCtrl的工作代码
- C++ / CannyEdgeDetection.exe 已停止工作 代码块 /OpenCV 错误:断言失败
- C //尝试重写一个工作代码以包括我的功能
- 如何在不保存文件的情况下制作打印屏幕并将其发送到FTP服务器?我的工作代码将文件保存到HDD
- 如何在不破坏当前工作代码的情况下添加小数
- 无法理解工作代码和损坏代码之间的区别
- .exe已停止工作代码块 CPP
- rapidjson:用于从文件中读取文档的工作代码