C++ 在C+中保持对象的持久性+;?

C++ 在C+中保持对象的持久性+;?,c++,memory-management,segmentation-fault,shared-ptr,shared-memory,C++,Memory Management,Segmentation Fault,Shared Ptr,Shared Memory,下面是我尝试创建 #包括 #包括 #包括 #包括 使用名称空间std; 类ObjectHoldingData{ 公众: ObjectHoldingData(int项); 国际项目; }; ObjectHoldingData::ObjectHoldingData(int项){ 此->项目=项目; } 具有数据的对象的向量列表; 类对象生成器{ 公众: 对象生成器(int计数器); 无效运行(); 整数计数器; }; ObjectGenerator::ObjectGenerator(int计数器){

下面是我尝试创建

#包括
#包括
#包括
#包括
使用名称空间std;
类ObjectHoldingData{
公众:
ObjectHoldingData(int项);
国际项目;
};
ObjectHoldingData::ObjectHoldingData(int项){
此->项目=项目;
}
具有数据的对象的向量列表;
类对象生成器{
公众:
对象生成器(int计数器);
无效运行();
整数计数器;
};
ObjectGenerator::ObjectGenerator(int计数器){
此->计数器=计数器;
}
void ObjectGenerator::run(){
ObjectHoldingData*obj=新的ObjectHoldingData(计数器);
对象列表带有数据。推回(obj);
for(unsigned int i=0;i
打印本地指针变量
currObj
的内存地址。在循环的每次迭代中,一个本地变量将位于相同的位置

为什么上面的例子没有遇到分段错误

上面的程序没有理由有segfault。没有非法的内存访问。程序的行为定义良好,尽管您确实泄漏了所有分配的内存

我不明白的是,listOfObjectsWithData中的所有对象如何具有相同的内存引用(当使用&)打印出来时)

打印本地指针变量
currObj
的内存地址。在循环的每次迭代中,一个本地变量将位于相同的位置

为什么上面的例子没有遇到分段错误


上面的程序没有理由有segfault。没有非法的内存访问。虽然您确实泄漏了所有分配的内存,但程序的行为定义良好。

&currObj
指向
currObj
指针的地址,而不是指向
ObjectHoldingData
实例。如果您想t要查看
ObjectHoldingData
实例的地址,只需打印指针:

// No ampersand '&'.
cout << "Object " << currObj->item << " with memory reference " << currObj << "\n";
//无符号“&”。

cout
&currObj
指向的是
currObj
指针的地址,而不是
ObjectHoldingData
实例。如果要查看
ObjectHoldingData
实例的地址,只需打印指针:

// No ampersand '&'.
cout << "Object " << currObj->item << " with memory reference " << currObj << "\n";
//无符号“&”。

可以生成一个,减少而不是重写,保留中间版本,并测试问题是否在减少时发生,这样就不会过多。如果给定的减少消除了问题,则改变减少而不是放弃(假设您没有从解决问题的减少中找出错误).via reproducton经常失败,因为如果你明白了什么是重要的,你通常就不需要帮助去理解你做错了什么。对不起,我不太明白。你说的减少而不是重写是什么意思?这是我第一次尝试给出这样的例子,唯一遗憾的是我没有成功地复制到错误。@JeremyKuah a如果不再现错误,则最小示例无效。请重试。若要生成最小示例,请减少而不是重写,保留中间版本,并测试问题是否在减少时发生,以避免超出范围。如果给定的减少消除了问题,请更改减少而不是放弃(假设您没有从解决问题的降价中找出问题所在).via reproducton经常失败,因为如果你明白了什么是重要的,你通常就不需要帮助去理解你做错了什么。对不起,我不太明白。你说的减少而不是重写是什么意思?这是我第一次尝试给出这样的例子,唯一遗憾的是我没有成功地复制到错误。@JeremyKuah a如果不再现错误,最小示例是无用的。再试一次。哦,对了,忘了我不需要&。谢谢你捕捉到了!哦,对了,忘了我不需要&。谢谢你捕捉到了!嗯,这是因为对象
ObjectHoldingData
是用
new
关键字创建的吗?在我的原始问题中..我只得到了inters和我尝试将其添加到
std::map
中。当我到达程序的第二个运行时实例时,每当我尝试从第一个运行时实例访问存储在
std::map
中的元素时,它将不起作用。它最终会出现
分段错误
。我说这是因为内存由于已被
删除
解除分配
?并且如果我将其存储为
新的
对象,则不会发生这种情况。此外,您所说的泄漏所有分配的内存是什么意思?我的意思是泄漏。是的,内存泄漏是因为它已分配
新的
,但未被删除。无法解释为什么会出现分段错误出现了一个我没有见过的程序。嗯,这是因为对象
ObjectHoldingData
是用
new
关键字创建的吗?在我最初的问题中..我只得到了指针,我尝试将其添加到
std::map
中。当我到达程序的第二个运行时实例时,每当我尝试访问ele时从第一个运行时实例存储在
std::map
中的内存将不起作用。并且它最终会出现
分段错误
。我说的对吗,这是因为内存已被
删除
解除分配
?如果我将其存储为
对象,这将不会发生。还有,你是什么意思n泄漏所有分配的内存?我的意思是泄漏。是的,内存泄漏是因为它被分配了
new
,但没有被删除。无法解释为什么我没有看到的程序会出现分段错误。