【发布时间】:2020-05-18 07:23:09
【问题描述】:
这个问题标题不清楚,有点破。我尝试使用成员 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);
}
};
};
【问题讨论】:
-
想想当
Object被复制或移动时会发生什么 -
您将参数
int val的值复制到对象的字段 (int val {0}) 中,但您并未将其指向新位置。然后,当您更新值时,您会读取字段的地址(不会随着您使用的对象而改变)。 -
另外,
void*演员表无效。 stackoverflow.com/questions/13875786/… -
您可能不会期望不同的地址,因为每次调用
emplace_back时可能会重新分配。当您从新创建的对象中打印出地址时,旧对象已被移动,并且先前打印的地址已更改 -
@S.M.我的理解是每次调用
emplace_back,就会有一个临时对象,以后会被盗。但即使我使用push_back,结果也一样。
标签: c++