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

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

有结构(类型)和函数,允许通过共享内存(shm_open 和 mmap)使用结构 returns 类型*。

Type* type = openSharedMemory(); 

如果共享内存为 null 并且声明 typeptr == nullptr 应该 returns 为真,我想在不创建但打开共享内存内存的过程中创建内容。 可能吗?

If I'm not mistaken it's useless do delete(typeptr) because I didn't alocate if with new()

不仅无用,而且很可能是未定义的行为。如果你幸运的话,程序会崩溃。

Is it possible to make typeptr nullptr?

是的。您可以赋值:

typeptr = nullptr;

It works only in the same process, where I create shared memory.

每个进程都有自己的内存,像 typeptr 这样的对象就存在其中。没有其他进程可以访问这些对象。将一个指针设置为 null 不会影响任何其他指针。

确实,如果您要设置为空的指针在创建共享内存的进程中,则只有该进程可以访问该指针,因此该进程必须设置该值...除非指针本身在另一个共享内存块中,我认为情况并非如此。

I want to make content if shared memory null

啊,把指向的内容设置为null和把指针设置为null是完全不同的。您可以使用 std::memset 将共享内存设置为全零。就像您使用非共享内存一样。

指针不是这样工作的。

如果您将指针设置为空,则内存仍会保留在那里,直到有人更改它。例如,即使内存中有 0,这也可能仅表示整数 0。这适用于 C++ 中的普通指针,也适用于共享内存。

你需要做的就是让记忆"invalid"。在 c++ 中没有执行此操作的标准,因此必须由您自己定义。

这里有多种选择。


一种是给自己定义一个无效的值,把数据设置成这个值

例如如果你有一个 int 但你知道你只在其中存储正数,你可以将它设置为 -1 以标记为无效(或 maximum/minimum 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" 时不再需要访问内存.但这并不总是可能的。