C ++ std :: vector“ this”是“ nullptr”

时间:2019-01-28 13:20:49

标签: c++ vector smart-pointers init nullptr

由于某种原因,我无法在datacenter.cpp中使用向量_vec。它说“ 这个”是“ nullptr”

请帮助,谢谢<3

datacenter.h

#pragma once
#include <iostream>
#include <vector>

class datacenter
{
public:
    datacenter();
    ~datacenter();

    void get_elements();

    std::vector<float> _vec;
};

datacenter.cpp

#include "datacenter.h"

datacenter::datacenter(){}

void datacenter::get_elements()
{
if (_vec.empty()) { //<---- the error appears here
    std::cout << "empty" << std::endl;
    }
}

datacenter::~datacenter(){}

main.cpp

#include <iostream>
#include <vector>
#include "datacenter.h"

class datacenter;

int main()
{
std::unique_ptr<datacenter> dc;
dc->get_elements();
}

3 个答案:

答案 0 :(得分:9)

麻烦来自:

std::unique_ptr<datacenter> dc;

这不会创建datacenter的实例,而只会创建指向该实例的(空)(智能)指针。您需要使用以下内容创建实例:

auto dc = std::make_unique<datacenter>();

另请参见

答案 1 :(得分:4)

std::unique_ptr是一个对象的容器,所包含的对象必须像是非智能指针一样被初始化,并且不会自动用黑魔法构造。

您所做的大致等于

datacenter* dc = nullptr;
dc->get_elements();

您需要先对对象进行验证:

auto dc = std::make_unique<datacenter>();

请记住,您很幸运地使用了std::unique_ptr,因为未初始化的变量本应包含垃圾值(而不是nullptr),在实际示例中使调试更加困难。

答案 2 :(得分:-1)

您的唯一指针未初始化,并且其内容为null。 您应该以这种方式初始化它:

std::unique_ptr<datacenter> dc = std::unique_ptr<datacenter>(new datacenter());

http://coliru.stacked-crooked.com/a/b54fa5fc05396e65