【问题标题】:Make content of shared memory null if its pointer is null c++ [closed]如果共享内存的指针为空,则使共享内存的内容为空c ++ [关闭]
【发布时间】:2017-03-07 08:08:48
【问题描述】:

有 struct (Type) 和 function,允许通过共享内存(shm_open 和 mmap)使用 struct 返回 Type*。

Type* type = openSharedMemory(); 

如果共享内存为 null 并且语句 typeptr == nullptr 应该在不是创建而是 openSharedMemory 内存的过程中返回 true,我想创建内容。 有可能吗?

【问题讨论】:

  • 或在 c++11 中 type = nullptr。虽然智能指针会更好。在那里你也可以拨打.reset()
  • @KlasLindbäck 它没有效果。在这种情况下,type == NULL 为 false。
  • @Hayt 完全不清楚这里需要智能指针。
  • @juanchopanza 是的,这取决于它是否是拥有指针。只是想知道它们的存在。

标签: c++ linux pointers shared-memory


【解决方案1】:

指针不是这样工作的。

如果您将指针设置为 null,则内存仍会保留在那里,直到有人更改它为止。即使内存中有 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

如果您在使用普通指针时对对象有明确的所有权,则可以避免这些事情。

在进程间通信中可能会变得有点复杂,所以你必须使用这样的机制。

在设计方面,最好让一个进程负责内存(分配和释放),并确保其他进程已完成,或者在“删除”内存时不再需要访问内存。但这并不总是可能的。

【讨论】:

  • 谢谢,我觉得它解决了我的问题。
【解决方案2】:

如果我没记错的话, delete(typeptr) 没用,因为我没有用 new() 分配 if

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

是否可以将typeptr设为nullptr?

是的。您可以分配值:

typeptr = nullptr;

它只适用于我创建共享内存的同一进程。

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

确实,如果要设置为 null 的指针位于创建共享内存的进程中,则只有该进程有权访问指针,因此该进程必须设置值...除非指针本身位于另一个共享内存块,我认为不是这样。

如果共享内存为空,我想制作内容

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

【讨论】:

  • 它只在我创建共享内存的同一个进程中工作。我还需要在打开SharedMemory这个内存的进程中检查它。
  • @Padmelina:指针不是这样工作的。
  • @user2079303 所以我有不同的指针,只能让我处理共享内存中的数据?如果我在 openSharedMemory 进程中创建进程中的指针为空,我只能是所有数据都是 0?
  • 所以我有不同的指针,只能让我处理共享内存中的数据?如果我在打开进程中创建进程中的指针为空,我只能是所有文件都是 0?
  • @Padmelina 对不起,我不明白你的问题。你能改写吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2021-05-18
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多