当我们在 C/C++ 中定义动态数组时,它使用头段来跟踪数组中(堆中)的元素数量。 例如:
int* mem = new int[8];
编译器将分配 sizeof(int)*8 字节。
int *temp = malloc(sizeof(int)*9)
将在第一个 sizeof(int) 字节中存储“8”,如下所示
*temp = 8;
然后设置mem地址以及相对于temp的下一个连续地址
mem = temp + 1;
因此,mem 将指向一个包含 8 个元素的数组,而不是 9 个元素。
当删除发生时,编译器将在与上述相反的过程中使用mem来释放该堆 block 中的内存
delete[] mem;
我的问题是
如果我们分配一个动态内存,该内存将在运行时在不同的模块中使用,并且我们设法使用分配的堆内存的头段来检索元素的数量,在多线程环境中使用是否安全?
(请假设在程序设计的每个模块中,没有提供辅助函数或属性来检索定义的动态数组中的元素数量(大小)。每个模块仅将地址(指针)传递给数组但不是它的大小)
最佳答案
不,在任何环境下都不安全。您不能依赖编译器在分配内存之前存储数组中的元素数量,因为它不是定义的行为。您永远不应该尝试达到这个值。
相反,甚至不要使用动态数组,而是选择 std::vector
。
关于c++ - 在多线程程序中使用动态数组的头段是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551551/