如果共享内存的指针为空,则使其内容为空
Make content of shared memory null if its pointer is null c++
有struct (Type)和function,允许通过共享内存(shm_open和mmap)返回Type*来使用struct。
Type* type = openSharedMemory();
我想让内容,如果共享内存为空,语句typeptr == nullptr
应该在不创建但openSharedMemory内存的过程中返回true。这可能吗?
指针不是这样的。
如果你设置一个指针为空,内存仍然保持在那里,直到有人改变它。即使内存中有一个0也可以是一个整数0。这不仅适用于c++中的普通指针,也适用于共享内存。
你需要做的是使内存"无效"。在c++中没有这样做的标准,所以必须自己定义。
这里有几个选项。
一种是为自己定义一个无效的值,并将数据设置为该值。
。如果您有int
,但您知道您只在那里存储正数,您可以将其设置为-1
以标记为无效(或最大/最小int,我想你明白这一点)。
然后检查它而不是指针
//in some header
static const int INVALID_VALUE = -1;
//some process
type->shared_int = INVALID_VALUE;
//somewhere else
if(type->shared_int != INVALID_VALUE) //or whatever
//do stuff
如果你在内存中有一个自定义结构体,你可以添加一个布尔标志,无论它是否有效
struct Type
{
bool valid = true; //c++11 initialize to true
//other data members
};
当你现在想要将内存标记为无效时,只需将成员设置为false并检查是否存在。
//some process
type->valid = false;
//somewhere else
if(type->valid)
//do stuff
如果在使用普通指针时明确了对象的所有权,就可以避免这些事情。
在进程间通信中,这可能会变得有点复杂,所以你必须使用这样的机制。
设计明智,最好有一个进程负责内存(分配和释放),并确保其他进程都完成了,或者在"删除"内存时停止需要访问内存。但这并不总是可能的。
如果我没记错的话,这是没用的delete(typetr)因为我没有用new()来分配它
不仅是无用的,而且很可能是未定义的行为。如果你幸运的话,程序会崩溃。
有可能使typetr为nullptr吗?
是的。你可以赋值:
typeptr = nullptr;
它只在我创建共享内存的进程中起作用。
每个进程都有自己的内存,其中存在像typeptr
这样的对象。没有其他进程可以访问这些对象。设置一个指针为空不会影响其他指针。
实际上,如果你想设置为空的指针在创建共享内存的进程中,那么只有该进程可以访问该指针,因此该进程必须设置该值…除非指针本身在另一个共享内存块中,我认为不是这种情况。
我想让内容如果共享内存为空
啊,将指向的内容设置为空与将指针设置为空完全不同。您可以使用std::memset
将共享内存设置为全零。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址