【发布时间】:2020-06-26 20:45:11
【问题描述】:
在我的实际应用程序中,我使用双连接边列表来存储平面的子部分,但我尝试减少代码以显示我的问题。
我有一个包含自定义结构的列表,我需要将其转换为指向存储在列表中的对象的指针向量。当我这样做时,在发生转换的函数内部,我的向量中的指针与指向列表中对象的指针相同,但在函数外部(当我将返回值存储在变量中时)指针变了。为什么会出现这种情况?它与移动/复制值有关吗?怎么了?
感谢您的帮助!
struct MyStruct
{
MyStruct* my_other_struct;
}
static std::vector<MyStruct*> structPointers(
std::list<MyStruct> structs)
{
std::vector<MyStruct*> struct_pointers;
struct_pointers.reserve(structs.size());
std::transform(structs.begin(), structs.end(),
std::back_inserter(struct_pointers),
[](MyStruct& ms){ return &ms; });
for (const MyStruct* ms : struct_pointers)
{
// this seems to print out the correct memory address
std::cout << ms << std::endl;
}
return struct_pointers;
}
int main()
{
std::list<MyStruct> structs;
structs.push_back(Struct());
structs.push_back(Struct());
structs.front().my_other_struct = &structs.back()
structs.back().my_other_struct = &structs.front()
std::vector<MyStruct*> struct_pointers = structPointers(structs)
// I get two different addresses printed out here and I don't understand why
std::cout << &structs.front() << std::endl;
std::cout << struct_pointers.front() << std::endl;
// I get two different addresses printed out here and I don't understand why
std::cout << &structs.back() << std::endl;
std::cout << struct_pointers.back() << std::endl;
return 0;
}
【问题讨论】:
标签: c++ pointers copy move-semantics