c++ - 在多线程程序中使用动态数组的头段是否安全?

标签 c++ arrays dynamic-arrays

当我们在 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/

相关文章:

php - 检查数组中的值是否已存在于数据库中+将数组添加到数据库

javascript - 数组的索引默认为最后一次迭代

c++ - 如何将递归转换为迭代解决方案

C++:如何洗牌动态指针数组?

c - 声明数组时出现错误 : Constant expression required,,例如 a[n]

javascript - 如何在对象内声明不会注册到 0 索引的数组?

java - 我在 netbeans 中使用的 array.sort 没有排序

c++ - C++ 中的显式类型转换

c++ - 在没有函数指针/内联的情况下将 C++ 函数作为参数传递?

c++ - 可以报​​告哪些类型的误报内存泄漏?