相关疑难解决方法(0)

何时在null实例上调用成员函数会导致未定义的行为?

请考虑以下代码:

#include <iostream>

struct foo
{
    // (a):
    void bar() { std::cout << "gman was here" << std::endl; }

    // (b):
    void baz() { x = 5; }

    int x;
};

int main()
{
    foo* f = 0;

    f->bar(); // (a)
    f->baz(); // (b)
}
Run Code Online (Sandbox Code Playgroud)

我们期望(b)崩溃,因为x空指针没有相应的成员.在实践中,(a)不会崩溃,因为this从不使用指针.

因为(b)取消引用this指针((*this).x = 5;),并且this为null,程序进入未定义的行为,因为取消引用null总是被称为未定义的行为.

(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?

c++ standards-compliance null-pointer undefined-behavior language-lawyer

115
推荐指数
2
解决办法
1万
查看次数

空引用是否可行?

这段代码是否有效(和定义的行为)?

int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)

这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...

当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:

if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud)

c++ null reference language-lawyer

91
推荐指数
4
解决办法
10万
查看次数

为什么解除引用空指针是未定义的行为?

根据ISO C++,取消引用空指针是未定义的行为.我的好奇心是,为什么?为什么标准决定声明它未定义的行为?这个决定背后的理由是什么?编译器依赖?似乎没有,因为根据C99标准,据我所知,它是明确定义的.机器依赖?有任何想法吗?

c++ pointers undefined-behavior

22
推荐指数
5
解决办法
9066
查看次数

在C++中将对成员的引用初始化为NULL

是否可以在c ++中将引用成员初始化为NULL?
我正在尝试这样的事情:

class BigClass
{
private:
  Object m_inner;
public:
  const Object& ReadOnly;
  BigClass() : ReadOnly(NULL)
  {
    Do stuff.
  }
};
Run Code Online (Sandbox Code Playgroud)

我知道我能做到这一点,如果我初始化"只读"到对象的实际的参考,但是当我想摆在那里"NULL",我得到的错误:

"无法从'int'转换为'const Object&'

我怎么解决这个问题?

c++ reference initialization-list

20
推荐指数
4
解决办法
4万
查看次数

在C++中,&*NULL是否定义良好?

C++标准的哪个版本(如果有的话)是以下定义明确的?

void foo(void) {
    char *nullPtr = NULL;
    &*nullPtr;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在&*nullPtr这里特别询问.我知道这只是*nullPtr未定义的 - 但这是一个单独的问题,因此当前链接的"重复"不是重复的.

请注意,我没有将结果分配给任何东西 - 第二行是一个简单的语句.

应该是一个有明显答案的问题,但是(就像在这些问题上看似经常发生的那样)我听到的同样有很多人说答案"明显未定义"为"明确定义".

在一个相当相关的说明,以下是什么?应该foo产生一个c?

extern volatile char c;

void bar(void) {
    volatile char *nonnullptr = &c;
    &*nonnullptr;
}
Run Code Online (Sandbox Code Playgroud)

(相同问题的C版本:C中的&*NULL定义良好吗?)

c++ language-lawyer

10
推荐指数
1
解决办法
395
查看次数

为什么空指针取消引用不是例外

空指针取消引用通常会导致运行时错误,程序立即崩溃.为什么不使这些情况特殊,抛出异常并允许程序员处理它运行时并保持程序运行?

c++ exception

2
推荐指数
1
解决办法
759
查看次数