代码之家  ›  专栏  ›  技术社区  ›  alekscooper

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

  •  1
  • alekscooper  · 技术社区  · 5 年前

    我正在学习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
    

    我不明白为什么我会收到这个错误信息,也不明白我该如何修复它。那么,我为什么要得到它,如何修复它?

    我很感激你的帮助。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Scheff's Cat    5 年前
        Corgi(const string& _nickname): nickname(nickname), rNickname(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