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

如何完全禁用断言

我的代码充满了召唤assert(condition).在调试版本中,我使用了g++ -g我的断言.令我惊讶的是,我可以看到断言也在我的发布版本中运行,编译时没有-g选项.

如何在编译时完全禁用我的断言?我应该NDEBUG在我生成的任何构建中明确定义,尽管它们是调试,发布或其他任何其他?

c c++ assert

70
推荐指数
5
解决办法
5万
查看次数

检查这是否为空

检查是否为空是否有意义?

说我有一个方法的课; 在该方法中,我检查this == NULL,如果是,则返回错误代码.

如果为空,则意味着该对象被删除.该方法甚至能够返回任何东西吗?

更新:我忘了提到可以从多个线程调用该方法,它可能导致该对象被删除而另一个线程在该方法内.

c++ null pointers

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

使用"this"对所有成员函数和属性进行不良实践?

最近,我在这里贴一张我的代码,并得到了评论(无关原来的问题),其使用this类的所有成员函数和属性是"不是简单的个人编码风格的问题,这是不好的做法".不幸的是,这个人拒绝详细说明并告诉我自己查一下.

我用谷歌了一堆(但它真的很难找了什么"这个"作为关键字),并期待在这里,但我只找到一些 例子this ,必须使用.

我知道使用this不可避免的情况(参数/变量具有相同的名称,模板继承等),但随着时间的推移我开始使用,this因为我可以更轻松,更快地找到我的代码.我的理由包括:

  • 快速检查函数f是否应该是一个成员函数:如果this代码中没有,它可以从类中取出
  • 快速检查是否f可以是一个const功能:如果this左边没有,很可能是可以制作const(并不总是,但我觉得它在浏览时很有用)
  • 快速检查对象是否以"预定义"方式"更改"自身f,或者它是否为复合成员函数(使用this对象操作的成员方法与没有此操作的对象的"外部"算法)
  • 调试; 即如果成员属性在任何点被赋予错误的值,我必须专注于包含的行this来找到问题,因为其他行不会更改对象

坦率地说,关于这种"不良做法"的评论让我感到不安.但是,一个评论本身并不意味着什么,所以我想问一下,this对于所有成员函数和属性使用一致性是否有任何不妥之处?如果是这样,那么将它置于(可能是笨拙的,不受欢迎的或不普遍的)个人风格并将其置于"不良实践"类别中的主要缺点是什么?

c++ class

25
推荐指数
2
解决办法
1129
查看次数