我希望以下代码会产生某些内存访问错误,但事实并非如此。有没有办法在编译期间强制执行它?
#include <iostream>
class B {};
class D : public B
{ public: int d; };
using namespace std;
main()
{
B *pB = new B;
((D*)pB)->d = 2;
cout << ((D*)pB)->d << endl;
}
据我了解,将指针指向D不会改变内存分配,因此访问“d”应该是非法的,对吗?
答案 0 :(得分:5)
是的,访问d
非法,并且您的代码有未定义的行为。
没有&#34;崩溃的概念&#34;在C ++中,因此要求以便携方式创建&#34;崩溃&#34;是没有意义的。如果程序的行为未定义,则它不可移植,并且语言规则不会告诉您程序正在执行的操作。
答案 1 :(得分:0)
这是非法的,但你正在施法,告诉编译器你知道你在做什么(不知道后果不要这样做)和cthat将你的指针从B *转换为D *,同时仍然是B在指向的位置obhect。所以这里的结果是 UNDEFINED ,因为您正在访问越界。
此外,最好选择C ++样式转换,而不是C样式转换(使用C风格转换),因为它们通常更安全。
答案 2 :(得分:0)
您正在做的事情通常不会导致崩溃,因为内存分配通常在幕后处理。
还有第三方产品可以检查此类错误(在这种情况下是缓冲区溢出)。只需搜索“内存调试器c ++”。大多数Windows工具都是商业用途,但可能有免费的工具。