如果共享内存的指针为空,则使共享内存的内容为空 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" 时不再需要访问内存.但这并不总是可能的。
有结构(类型)和函数,允许通过共享内存(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" 时不再需要访问内存.但这并不总是可能的。