繁体   English   中英

如何获得此void *的值?

[英]How do I get the value of this void* back?

我有一个无效指针,我可以设置该值就好了(至少我认为我做对了)。 但是当我试图获得存储在那里的东西的价值时,我什么都得不回来。 如果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;
    }
};

void setData(T data) 按值接收data

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

之后,指针悬空 ,取消引用行为未定义

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

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

试试这样:

// 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;

不要将数据存储为void,模板类如下:

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

那里没有任何东西。

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

你可以随心所欲地施放,但那个对象已经消失了!

除非您动态分配,否则此设计无效。

考虑使用std::variant或其他东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM