如果共享内存的指针为空,则使其内容为空

Make content of shared memory null if its pointer is null c++

本文关键字:指针 共享 如果 内存      更新时间:2023-10-16

有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将共享内存设置为全零。