错误:创建对象后无法分配区域

问题描述 投票:1回答:1

我正在学习C ++中OOP的各种细节,并编写了该代码。该代码的目的是玩弄ctor初始化程序,并学习如何对作为类属性的引用进行惯性化。

#include <string>
#include <iostream>

using namespace std;

class Corgi {
    private:
        const string nickname;
        const string& rNickname;
    public:
        Corgi(const string& _nickname): nickname(nickname), rNickname(nickname) {}
};

int main() {
    Corgi buddy("buddy");
    return 0;
}

此代码编译,但是运行时出现此错误消息:

Project(1343,0x7fff7b2f2000) malloc: *** mach_vm_map(size=140734714511360) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

我不明白为什么会收到此错误消息以及如何解决该错误消息。那么,为什么我要得到它以及如何解决呢?

感谢您的帮助。

c++ constructor reference
1个回答
2
投票
    Corgi(const string& _nickname): nickname(nickname), rNickname(nickname) {}

使用成员自身初始化成员nickname,这是一个问题,因为成员nickname此时尚未初始化。

修正:

    Corgi(const string& _nickname): nickname(_nickname), rNickname(nickname) {}

Live Demo on coliru


我也考虑过这个:

    Corgi(const string& nickname): nickname(nickname), rNickname(nickname) {}

这将适用于Corgi::nickname的适当初始化(由于范围规则),但是它为Corgi::rNickname引入了新问题(现在已通过引用构造函数参数对其进行了初始化。

在这种情况下,正确的是:

    Corgi(const string& nickname): nickname(nickname), rNickname(this->nickname) {}

Live Demo on coliru

© www.soinside.com 2019 - 2024. All rights reserved.