相关疑难解决方法(0)

当C++引用离开其范围时会发生什么?

如果我正确地解释C++引用,它们就像指针一样,但保证数据完整性(没有NULL,没有(int*)0x12345).但是当引用对象的范围被遗漏时会发生什么?如果没有涉及魔法(可能不是),引用的对象将在我背后被摧毁.

我写了一段代码来检查:

#include <iostream>
using namespace std;

class A {
public:
        A(int k) { _k = k; };
        int get() { return _k; };
        int _k;
};

class B {
public:
        B(A& a) : _a(a) {}
        void b() { cout << _a.get(); }
        A& _a;
};

B* f() {
        A a(10);
        return new B(a);
}

int main() {
        f()->b();
}
Run Code Online (Sandbox Code Playgroud)

_k实例变量放入检查堆栈帧的存在.

令人惊讶的是,它不是段错误而是正确地打印'10',而我认为它A是在堆栈上分配的,并且堆栈帧f()将被至少cout<<调用覆盖.

c++

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

当我通过引用传递一个对象并且它超出范围时,在C++中会发生什么?

我认为这个问题最好用我刚写的一个小代码片段:

#include <iostream>

using namespace std;

class BasicClass
{
public:
    BasicClass()
    {
    }
    void print()
    {
        cout << "I'm printing" << endl;
    }
};

class FriendlyClass
{
public:
    FriendlyClass(BasicClass& myFriend) :
        _myFriend(myFriend)
    {
    }
    void printFriend()
    {
        cout << "Printing my friend: ";
        _myFriend.print();
    }
private:
    BasicClass& _myFriend;
};

int main(int argv, char** argc)
{
    FriendlyClass* fc;
    {
        BasicClass bc;
        fc = new FriendlyClass(bc);
        fc->printFriend();
    }
    fc->printFriend();
    delete fc;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码使用g ++编译并运行良好:

$ g++ test.cc -o test
$ …
Run Code Online (Sandbox Code Playgroud)

c++

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

C++:引用"超出范围"对象

有一件事我从未理解过参考文献,我希望有人可以帮助我.据我所知,引用不能为空.但是如果你有一个函数foo()返回对堆栈对象的引用会发生什么:

Object & foo(){
    Object o;
    return o;
}

Object & ref = foo();
Run Code Online (Sandbox Code Playgroud)

理论引用将引用一个不存在的对象,因为一旦函数返回,o就会超出范围.这里发生了什么事?

c++ reference

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

标签 统计

c++ ×3

reference ×1