相关疑难解决方法(0)

c ++使用空指针访问静态成员

最近尝试了以下程序,它编译,运行正常并产生预期的输出,而不是任何运行时错误.

#include <iostream>
class demo
{
    public:
        static void fun()
        {
            std::cout<<"fun() is called\n";
        }
        static int a;
};
int demo::a=9;
int main()
{
    demo* d=nullptr;
    d->fun();
    std::cout<<d->a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果未初始化的指针用于访问类和/或结构成员,则行为未定义,但为什么允许使用空指针访问静态成员.我的计划有什么危害吗?

c++ static-members nullptr language-lawyer c++11

22
推荐指数
1
解决办法
3618
查看次数

C++静态const通过NULL指针访问

class Foo {
public:
 static const int kType = 42;
};

void Func() {
 Foo *bar = NULL;
 int x = bar->kType;
 putc(x, stderr);
}
Run Code Online (Sandbox Code Playgroud)

这是定义的行为吗?我阅读了C++标准但是找不到任何关于访问静态const值的内容......我已经检查了GCC 4.2,Clang ++和Visual Studio 2010生成的程序集,并且它们都没有执行NULL的解引用指针,但我想确定.

c++ static pointers

12
推荐指数
1
解决办法
1919
查看次数

[expr.ref]/1中提到的脚注究竟是什么意思?

[expr.ref]/1:

后缀表达式后跟一个点.或箭头->,可选地后跟关键字template(17.2),然后是id-expression,后缀表达式.评估点或箭头之前的后缀表达式; 67该评估的结果与id-expression一起确定整个后缀表达式的结果.

67)如果计算了类成员访问表达式,则即使不需要结果来确定整个后缀表达式的值,也会发生子表达式求值,例如,如果id-expression表示静态成员.

c++ language-lawyer member-access

8
推荐指数
1
解决办法
568
查看次数

std::uniform_int_distribution 的分段错误

我有一个包含多个类的程序,其中一些需要随机双精度和整数。在其中一个类中,我定义了一个结构来为随机引擎提供种子,并且能够在需要时通过该结构的对象生成随机实数和整数。带有类和结构声明的 .hpp 文件如下所示:

struct RNG {
public:
    static std::mt19937 gen;
    static std::uniform_int_distribution<uint32_t> dist_ui;
    static std::uniform_real_distribution<double> dist_d;
    uint32_t r_ui = dist_ui(gen);
    double r_d = dist_d(gen);
private:
    static unsigned seed;
};

class A {
private:
    uint32_t a_;
public:
    A();
};
Run Code Online (Sandbox Code Playgroud)

.cpp 文件如下所示:

#include "A.hpp"

unsigned RNG::seed = 42;
std::mt19937 RNG::gen(RNG::seed);
std::uniform_int_distribution<uint32_t> RNG::dist_ui(1, std::numeric_limits<uint32_t>::max());
std::uniform_real_distribution<double> RNG::dist_d(0.0,1.0);

A::A() {
    RNG* r;
    a_ = r->dist_ui(r->gen);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我调用uniform_real_distribution

r->dist_d(r->gen)
Run Code Online (Sandbox Code Playgroud)

一切正常。但是,如果我调用uniform_int_distribution

r->dist_ui(r->gen)
Run Code Online (Sandbox Code Playgroud)

与上面的代码片段一样,我遇到了分段错误。如果我仅使用 int dist 而不是 real 和 int 来定义结构,或者将 int dist 的边界更改为 [0,100) 或其他任何内容,也会发生错误。有谁知道这里发生了什么?我感谢任何帮助!

编辑:如果我像这样访问非静态成员,我会得到同样的错误

RNG …
Run Code Online (Sandbox Code Playgroud)

c++ random segmentation-fault c++11

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