相关疑难解决方法(0)

如何在C++中转换/转换指向引用

如何将指针(Object *ob)传递给原型的函数void foo(Object &)

c++ pointers casting reference type-conversion

134
推荐指数
2
解决办法
11万
查看次数

何时在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万
查看次数

指针与参考返回类型

我试图想出一个具体的推理,为什么要在引用上使用指针作为函数的返回类型,

我的理由是,如果无意中将null值返回给引用类型,则无法检查它,并可能导致运行时错误

  int& something(int j)
  {
      int* p = 0 ;  
      return *p;
  }

  void main()
  {
      int& i = something(5);
      i = 7;   // run-time error 
  }
Run Code Online (Sandbox Code Playgroud)

如果我使用了指针,我可以检查它并避免错误,指针返回值将作为合同,必须返回一个值.

 void main()
 {
         int* i = something(5);
         if( i != null )
             *i = 7;
 }
Run Code Online (Sandbox Code Playgroud)

任何想法将再次受到赞赏,

你会用什么以及为什么引用或指针

提前致谢.

c++ pointers reference

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

是否在NULL指针上调用函数未定义?

可能重复:
何时在null实例上调用成员函数会导致未定义的行为?
C++标准:解除引用NULL指针以获取引用?

说我有班级:

class A
{
public:
   void foo() { cout << "foo"; }
};
Run Code Online (Sandbox Code Playgroud)

并像这样调用foo:

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

我怀疑这会调用未定义的行为,因为它等同于(*a).foo()(或者它是?),并且取消引用a NULL UB,但我找不到引用.谁能帮我吗?还是定义了?

不,功能不是virtual.不,我没有访问任何成员.

编辑:我投票结束这个问题,但不会删除它,因为我自己找不到副本,我怀疑这个标题可能更容易被其他人找到.

c++ undefined-behavior

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

试图访问空指针

#include <iostream>

int main()
{
    int* i = 0;
    int x = (*i);
    std::cout << x;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,上面的程序将崩溃Visual Studio 2010,我知道它崩溃,因为我将指针设置为0.

我想知道的是,访问null pointer标准中定义的C++,还是未定义的,我很幸运,因为我的编译器/计算机/操作系统,我的程序崩溃了

如果定义了,当我尝试访问空指针时C++会保证什么?

c++ null pointers

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

强制允许取消引用NULL指针

我有一个非常古老的(和巨大的)Win32项目,该项目使用NULL指针进行大量检查,通过强制转换为指向解除引用的指针.像这样:

int* x = NULL; //somewhere
//... code
if (NULL == &(*(int*)x) //somewhere else
    return;
Run Code Online (Sandbox Code Playgroud)

是的,我知道这段代码很愚蠢,需要重构.但由于代码量很大,这是不可能的.现在我需要在Xcode的MacOS Sierra下编译这个项目,这会导致很大的问题......事实证明,在发布模式下(使用代码优化),条件以不正确的行为执行(因为解除引用NULL而被称为未定义的行为指针).

根据GCC的这个文档,有一个选项-fno-delete-null-pointer-checks,但是当启用O1,O2或O3优化时,它似乎不适用于LLVM.所以问题是:如何强制LLVM 8.0编译器允许这样的解引用?

UPDATE.检查问题的真实工作示例.

//somewhere 1
class carr
{
public:
    carr(int length)
    {
        xarr = new void*[length];

        for (int i = 0; i < length; i++)
            xarr[i] = NULL;
    }

    //some other fields and methods

    void** xarr;
    int& operator[](int i)
    {
        return *(int*)xarr[i];
    }
};

//somewhere 2
carr m(5);

bool something(int i)
{
    int* el = &m[i]; …
Run Code Online (Sandbox Code Playgroud)

c++ null-pointer undefined-behavior dereference clang++

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

如何在Qt中模拟崩溃?

很简单的问题,但我在网上找不到任何解决方案.

是否有可能迫使Qt应用程序崩溃?

这仅用于开发目的,因为我想试验崩溃报告.

c++ qt qt5

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

你可以通过解除引用指针返回一个整数吗?

int f(int *x)
{
    *x = 5;
    return *x;
}

int main()
{
    int * y = 0;
    int z = f(y);
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码会给我一个运行时错误?

c++ pointers undefined-behavior

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

解除引用NULL指针和未初始化指针之间的区别

在代码块(C++)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int *p;
    cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)

产生垃圾价值,而

#include<bits/stdc++.h>
using namespace std;
int main(){
    int *p=NULL;
    cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)

导致运行时错误.我预计两者的运行时错误(ideone会为两者产生运行时错误),因为两者都是错误的指针.怎么能解释这个呢?

c++ pointers

-7
推荐指数
1
解决办法
270
查看次数