【发布时间】:2018-12-09 01:58:10
【问题描述】:
TL;DR:为什么一个指向共享内存中对象的指针在一个简单的范围改变后变得无效?指针本身不在共享内存中。为什么它会变得无用?
假设为了示例,我有一个简单的自定义数据类型:
class CustomDataType
{
public:
short val;
CustomDataType(short val__) { val = val__; };
virtual ~CustomDataType() {};
short square() { return val*val; };
};
我有一些函数在共享内存中创建这个对象的一个实例并返回一个指向该对象的指针:
CustomDataType* someFunction()
{
shared_memory_object::remove("Boost");
managed_shared_memory managed_shm{ open_or_create, "Boost", 1024 };
CustomDataType *i = managed_shm.construct<CustomDataType>("CustomDataTypeObject")(7);
std::cout << i->square() << std::endl;
return i;
}
我的 main 调用了这个函数,然后尝试访问返回的指针:
void main()
{
CustomDataType* customData = someFunction();
std::cout << customData->square() << std::endl; // <------- program crashes
}
通过函数内的指针第一次调用方法'square'有效。
但是,通过 main 中的指针对方法“square”的第二次调用失败。
为什么指针在范围变化后无法生存?我在同一个进程,对象还在内存中。
一旦 managed_shared_memory 超出范围,指针是否会变得无用,即使它没有改变内存中的任何内容?
我是否缺少使指针在范围更改后仍然存在的东西?
我还尝试用 offset_ptr 替换标准指针,或者通过引用函数而不是返回它来传递指针。没有任何东西改变了代码的行为。
最小、完整和可验证的示例:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <iostream>
using namespace boost::interprocess;
class CustomDataType
{
public:
short val;
CustomDataType(short val__) { val = val__; };
virtual ~CustomDataType() {};
short square() { return val*val; };
};
CustomDataType* someFunction()
{
shared_memory_object::remove("Boost");
managed_shared_memory managed_shm{ open_or_create, "Boost", 1024 };
CustomDataType *i = managed_shm.construct<CustomDataType>("CustomDataTypeObject")(7);
std::cout << i->square() << std::endl;
return i;
}
void main()
{
CustomDataType* customData = someFunction();
std::cout << customData->square() << std::endl; // <------- program crashes
}
【问题讨论】:
-
[Off Topic]
void main()是错误的。它必须是int main(/* can be params here */) -
它确实使 Minimal [...] 示例略小。
标签: c++ pointers boost shared-memory