我正在调试一个崩溃日志.发生崩溃是因为(c ++ - )对象的vtable指针是0x1,而对象的其余部分似乎可以从崩溃日志中看出来.
程序在尝试调用虚方法时崩溃.
我的问题:在什么情况下vtable指针变为空?operator delete是否将vtable指针设置为null?
这在OS X上使用gcc 4.0.1(Apple Inc. build 5493)发生.
说我有这样的表达
short v = ( ( p[ i++ ] & 0xFF ) << 4 | ( p[ i ] & 0xF0000000 ) >> 28;
Run Code Online (Sandbox Code Playgroud)
用p作为一个指针的32位整数的动态分配的数组.
当究竟会i递增?我注意到上面的代码提供了v与以下代码不同的值:
short v = ( p[ i++ ] & 0xFF) << 4;
v |= ( p[ i ] & 0xF0000000 ) >> 28;
Run Code Online (Sandbox Code Playgroud)
我对这种行为的最佳猜测是,i在|评估上面的右侧之前不会增加.
任何见解将不胜感激!
提前致谢,
\比约恩
我理解为什么这会导致段错误:
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
int iArr[5] = {1, 2, 3, 4, 5};
int *p = iArr;
copy(p, p+5, v.begin());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但为什么这不会导致段错?
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
int iArr[5] = {1, 2, 3, 4, 5};
int *p = iArr;
v.reserve(1);
copy(p, p+5, v.begin());
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是(++i)++未定义的行为?在检索增量对象以进行后缀增量操作后,是否可能发生前缀增量的副作用?这对我来说似乎很奇怪.
我的直觉是,这在C++ 03中是未定义的,在C++ 11中定义良好.我对吗?
c++ undefined-behavior sequence-points language-lawyer c++11
您将获得在运行时崩溃的应用程序的源代码.在调试器中运行10次后,您发现它永远不会在同一个地方崩溃.该应用程序是单线程的,仅使用C标准库.哪些编程错误可能导致此崩溃?你会如何测试每一个?
我准备为C++自我和同行代码评审准备一份清单或指南,因为有太多的场景可能导致可怕的领域Undefined Behavior,我想要提出一种在大多数使用最多的未定义行为的清单C++语言结构.
当然,不可能通过修改变量来预测未定义的行为,Sequence points但我认为可以列出从其他场景中发现的场景.
如果您正在执行代码审查,Undefined Behavior您会注意哪些常见的生成方案?
我有一个人声称这条线不在C++标准中:
int i(1);
array_of_int[i] = i++;
Run Code Online (Sandbox Code Playgroud)
该人士表示,将指派1,但我们无法知道它是否会在array_of_int[1]或array_of_int[2]虽然Visual Studio和大多数编译器都会在array_of_int[1].
他是对的吗?
int data[8];
data[9] = 1;
Run Code Online (Sandbox Code Playgroud)
c ++标准对此有何评论?这是未定义的行为吗?
至少C编译器(gcc -std = c99 -pedantic -W -Wall)对此没有任何说明.
谢谢.
在准备考试时,ANSI CI遇到了以下问题 -
以下声明是否有效?
如果没有,请进行必要的更改以使其有效.
原始陈述是:test(i++,i++);它无效,因为根据K&R p202,行为未定义
参数的评估顺序未指定
但我可以将其更改为以下声明吗?test(i+=2, i+=3)?
我在K&R或任何其他来源中没有看到这样的记录的问题.但XCode编译它并在没有任何警告的情况下运行.
我有以下代码:
const int k=1;
int *p=const_cast<int *>( &k);
cout<<"k before="<<*p<<endl;
*p=10;
*const_cast<int *>( &k)=12;
cout<<"k after="<<k<<endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
k before=1
k after=1
Run Code Online (Sandbox Code Playgroud)
为什么const const不在这里工作?