相关疑难解决方法(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万
查看次数

在一个定义良好的非构造"对象"上调用非虚拟成员函数?

在构造函数内部,允许调用非虚拟成员函数.

从这个事实可以看出,以下代码是明确定义的吗?

struct A {
    void foo { std::cout << "Hi there! My address is: " << this; }
};

A * a = nullptr;
a->foo ();
Run Code Online (Sandbox Code Playgroud)

回答?

借助评论中给出的一些链接以及链接页面中给出的链接,我现在认为答案可以在例如

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3035.pdf

§3.8标准杆 5,p.66:

"在对象的生命周期开始之前,但在对象将占用的存储空间被分配之后... [t]如果指针用于访问非静态数据成员,则程序具有未定义的行为或者调用对象的非静态成员函数"

如果根本没有分配存储,那么调用成员函数应该更加未定义.

我想这里有一个很重要的原因可以让它定义为未定义:https://stackoverflow.com/a/3257755/1419315

c++

6
推荐指数
1
解决办法
171
查看次数

在没有访问任何数据的NULL指针上调用方法是否会失败?

该计划是否:

#include <stdio.h>

struct foo
{
   void blah()  {printf("blah\n");}
   int i;
};

void main(int, char**)
{
   ((foo*)NULL)->blah();
}
Run Code Online (Sandbox Code Playgroud)

blah在你知道的任何编译器上崩溃,或者做输出以外的任何事情?当通过NULL指针调用时,任何函数是否会崩溃,如果它不访问任何成员(包括vtable)?

关于这个主题还有其他问题,例如在NULL指针上访问类成员,并且它是合法/定义良好的C++来调用不通过空指针访问成员的非静态方法吗?,并且总是指出这会导致未定义的行为.但这在现实世界中是不确定的,还是只在标准的世界中?现有的编译器是否表现不如预期?你能想到为什么未来的编译器不会按预期运行的任何合理的理由吗?

如果函数确实修改了成员,但是保护了NULL ptr.例如,

void foo::blah()
{
   foo* pThis = this ? this : new foo();
   pThis->i++;
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于记录,我想要的原因是使我的链表类的接口尽可能简单明了.我想将列表初始化为NULL,其惯用用法如下:

pList = pList->Insert(elt);
pList = pList->Remove(elt);
...
Run Code Online (Sandbox Code Playgroud)

所有操作员返回新头元素的位置.不知怎的,我没有意识到使用容器类会让事情变得更容易,没有任何缺点.

c++ methods null pointers

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