C++ - 非静态 void* 成员,指向具有相同地址但不同值的不同对象的另一个非静态成员

C++ - non-static void* member pointing to another non-static member of different objects having same address but distinct value

本文关键字:静态成员 地址 对象 另一个 void 静态 成员 C++      更新时间:2023-10-16

这个问题的标题不清楚,有点破。我尝试使用一个成员void*来存储另一个成员的地址。我不小心发现了一个奇怪的问题。在vector<T>内创建了三个Object对象。但是当我查看这三个val_addr的值时,它们总是指向相同的地址,但显然每个val总是唯一的。

class Object {
protected:
int val {0};
void *val_addr = nullptr;
std::vector<Object> objs;
public:
Object() = default;
Object(int val) 
{
this->val = val;
this->val_addr = (void *) &this->val;
std::cout << "val_addr: " << val_addr << "n"; // always 0X123456 for example
}
std::vector<Object>& get_objs() 
{
return objs;
}
};
class Iterable : public Object {
public:
Iterable(const std::set<int>& values) { // {1, 2, 3} inside values
for (const auto & c : values) {
this->objs.emplace_back(c);
}
};
};

任何指向对象成员的指针在矢量扩展后都将失效。在放置新的矢量元素并扩展矢量后,您在对象构造函数中看到的地址无效。因此,您在创建对象时看到了地址,当您查看另一个对象中成员的地址时,以前的地址无效,可能无法进行比较。复制前面的对象并更改&this->valthis->val_addr仍包含旧的无效地址。您应该更新复制构造函数中的this->val_addr

class Object {
protected:
int val {0};
int *val_addr = nullptr;
public:
Object() = default;
Object(int val) 
{
this->val = val;
this->val_addr = &this->val;
std::cout << "val_addr: " << val_addr << "n";
}
Object(const Object& obj) 
{
this->val = obj->val;
this->val_addr = &this->val;
std::cout << "new val_addr: " << val_addr << "n";
}
std::vector<Object> &get_objs() const 
{
return objs;
}
};