gpt4 book ai didi

c++ - 类成员作为对另一个 : crash in assignment operator 的引用

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:43 25 4
gpt4 key购买 nike

我有一个 Bar 类,其中引用了其中一个成员的内部 (Bar::foo):

#include<vector>
#include<algorithm>

struct Foo{
int x, y;
};

struct Bar{
Foo foo;
int &x, &y;
Bar(): x(foo.x), y(foo.y){}
// copy constructor and assignment operator
Bar(const Bar& other): foo(other.foo), x(foo.x), y(foo.y){}
Bar& operator=(const Bar& other){ foo=other.foo; return *this; }
};

int main(void){
std::vector<Bar> a, b;
Bar p; p.x=0; p.y=0;
a.push_back(p);
std::copy(a.begin(),a.end(),b.begin());
}

使用 g++ 编译(没有任何特殊选项),我在赋值运算符中崩溃。为什么?

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400b29 in Bar::operator= (this=0x0, other=...) at ref2.cpp:14
14 Bar& operator=(const Bar& other){ foo=other.foo; return *this; }
(gdb) bt
#0 0x0000000000400b29 in Bar::operator= (this=0x0, other=...) at ref2.cpp:14
#1 0x00000000004016a0 in std::__copy_move<false, false, std::random_access_iterator_tag>::__copy_m<Bar*, Bar*> (
__first=0x405010, __last=0x405030, __result=0x0) at /usr/include/c++/4.6/bits/stl_algobase.h:329
#2 0x000000000040148d in std::__copy_move_a<false, Bar*, Bar*> (__first=0x405010, __last=0x405030, __result=0x0)
at /usr/include/c++/4.6/bits/stl_algobase.h:384
#3 0x0000000000401157 in std::__copy_move_a2<false, __gnu_cxx::__normal_iterator<Bar*, std::vector<Bar, std::allocator<Bar> > >, __gnu_cxx::__normal_iterator<Bar*, std::vector<Bar, std::allocator<Bar> > > > (__first=..., __last=...,
__result=...) at /usr/include/c++/4.6/bits/stl_algobase.h:422
#4 0x0000000000400cc0 in std::copy<__gnu_cxx::__normal_iterator<Bar*, std::vector<Bar, std::allocator<Bar> > >, __gnu_cxx::__normal_iterator<Bar*, std::vector<Bar, std::allocator<Bar> > > > (__first=..., __last=..., __result=...)
at /usr/include/c++/4.6/bits/stl_algobase.h:454
#5 0x00000000004009f4 in main () at ref2.cpp:21

最佳答案

这合法吗?

不,因为匿名结构是不合法的。如果你给它命名,它将调用未定义的行为除非 foo 首先被正确初始化(特别是你不能读取x y 成员(如果您初始化了 data)。

一旦我解决了所有这些问题,这还会导致什么其他问题?

嗯,首先,任何类型的引用成员都会抑制赋值运算符的生成。这对你来说可能重要也可能不重要。然后,编译器生成的复制构造函数会咬你一口:它只是盲目地复制所有成员,以 foo 成员的拷贝和引用 foo 的引用成员结束原始对象。如果这个原始对象的生命周期较短,就会发生不好的事情。您可能想要编写复制构造函数,或者考虑没有引用成员的替代设计。

关于c++ - 类成员作为对另一个 : crash in assignment operator 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com