仅当在函数内部构建对象时,EXC_错误访问 我正在xC++中开发C++项目,我得到了一些奇怪的行为(基于我是如何理解的)。这是我的密码: #include <iostream> #include <vector> #include <string> class beep { public: virtual void greet() { std::cout << "bleep\n"; } }; class boop : public beep { public: void greet() { std::cout << "bloop\n"; } }; class beep_master { public: std::vector<beep*> beeps; void beep_everything() { for (int i = 0; i < beeps.size(); i++) { beeps[i]->greet(); } } }; beep_master factory() { boop boop1; boop boop2; beep_master master; master.beeps.push_back(&boop1); master.beeps.push_back(&boop2); return master; } int main(int argc, const char * argv[]) { beep_master master = factory(); beep_master* ref = &master; ref->beep_everything(); return 0; } #包括 #包括 #包括 类嘟嘟声{ 公众: 虚拟虚空(){ std::不能发出嘟嘟声; 返回0; }

仅当在函数内部构建对象时,EXC_错误访问 我正在xC++中开发C++项目,我得到了一些奇怪的行为(基于我是如何理解的)。这是我的密码: #include <iostream> #include <vector> #include <string> class beep { public: virtual void greet() { std::cout << "bleep\n"; } }; class boop : public beep { public: void greet() { std::cout << "bloop\n"; } }; class beep_master { public: std::vector<beep*> beeps; void beep_everything() { for (int i = 0; i < beeps.size(); i++) { beeps[i]->greet(); } } }; beep_master factory() { boop boop1; boop boop2; beep_master master; master.beeps.push_back(&boop1); master.beeps.push_back(&boop2); return master; } int main(int argc, const char * argv[]) { beep_master master = factory(); beep_master* ref = &master; ref->beep_everything(); return 0; } #包括 #包括 #包括 类嘟嘟声{ 公众: 虚拟虚空(){ std::不能发出嘟嘟声; 返回0; },c++,C++,我通过XCode运行它,在beep\u master中的for-循环中,我得到了一个EXC\u BAD\u ACCESS。我在互联网上看到的每一个地方似乎都表明这是由于一些内存管理问题,但我并没有真正动态分配任何内容 我注意到,如果我将factory的内容移动到main中,我就不会再收到错误,这让我相信它与boop1和boop2超出范围,并在代码退出该函数后使指针无效有关 谈到这一点,我开始认为,如果不通过new操作符和shared\u ptr使用动态内存,这个问题是不可避免的。这是正确的方向,

我通过XCode运行它,在
beep\u master
中的
for
-循环中,我得到了一个
EXC\u BAD\u ACCESS
。我在互联网上看到的每一个地方似乎都表明这是由于一些内存管理问题,但我并没有真正动态分配任何内容

我注意到,如果我将
factory
的内容移动到
main
中,我就不会再收到错误,这让我相信它与
boop1
boop2
超出范围,并在代码退出该函数后使指针无效有关


谈到这一点,我开始认为,如果不通过
new
操作符和
shared\u ptr
使用动态内存,这个问题是不可避免的。这是正确的方向,还是我在这里的设置中遗漏了什么?

你是对的。
工厂
函数正在存储指向局部变量的指针
boop>1
boop2
,当函数返回时,它们会消失,因此留下指向无效数据的指针


你将不得不动态地分配你的对象来存储向量中的指针。

这是有道理的,但我也发现,如果我的对象碰巧有一个属性,该值在返回后仍然正确设置,至少在返回后立即设置。这可能是“典型行为”,或特定于LLVM的行为。我发现这很有趣。@ChipBell函数作用域结束时调用的本地对象的默认析构函数可能会执行尽可能少的工作,并且不可能实际修改任何对象成员。因此,在返回后,您有指向现在包含任何后续函数调用都很可能用新数据覆盖这些位置。