如何获得此void *的价值?

时间:2018-08-30 12:01:41

标签: c++ pointers void

我有一个void指针,可以将其设置得很好(至少我认为我做对了)。但是,当我尝试获取存储在其中的值时,我什么也得不到。不管void *是否指向字符串或int或其他任何东西,都没有关系。 我在这里想念什么?

class Vertex2{
public:
    int _id;

    void *_data;

    template<typename T>
    T getData() {
        T *value = (T*)_data;
        return *value;
    }

    template <typename T>
    void setData(T data) {
        _data  = &data;
    }
};

4 个答案:

答案 0 :(得分:6)

void setData(T data)通过值接收data

因此,设置指向data的指针仅在该函数调用的生存期内有效。

此后,指针悬垂,取消引用行为为未定义

答案 1 :(得分:4)

template <typename T>
void setData(T data) {
    _data  = &data;
}

让我们检查一下这里发生了什么。您存储一个指向局部变量的指针(实际上是方法参数)。离开方法后,本地var被销毁,并且其内存可以自由重用。现在您的void*指向相同的内存地址,但是内存可以包含任何内容。

答案 2 :(得分:3)

像这样尝试:

// the entire class should be templated and you should not cast the data to void
template<typename T>
class Vertex2
{
public:
    int _id;
    // data is no longer void
    T m_data;

    // now returning a const pointer to your data and protect it against manipulation from outside
     getData() const {
        return m_data;
    }

    // was setting the address of a temporary, that will not work. Now it takes a copy and moves that to the member.
    void setData(T data) {
        m_data = std::move(data);
    }
};

我已经在代码中添加了注释。

关于您的代码

template <typename T>
void setData(T data) {
    _data  = &data;
}

不要那样做。您将地址存储到数据的临时副本。这会出错!

  

void *_data;

不要将数据存储为空,请对此类进行模板化:

template<typename T>
class Vertex2
{
    T m_data;
    .
    .
    .

答案 3 :(得分:2)

那里什么也没有存储。

您将指针设置为指向函数参数,然后该参数超出了范围。

您可以随意投射,但该对象已消失!

除非您动态分配,否则此设计将不起作用。

考虑使用std::variant或其他内容。