我的线程例程是这样的
void * dowork(void * args)
{
char* ptr = new char[25];
memset(ptr, 0, sizeof(ptr));
// Do some operations with ptr
// What if I call delete[] ptr
}
我已经初始化了 5 个线程。 现在的问题,
- 这个线程安全吗?
- 哪个线程拥有内存?
ptr
是否会在每次新线程处理dowork
时重新初始化?如果是,之前分配的内存会怎样?- 如果
delete[] ptr
被用在dowork
的末尾怎么办?
最佳答案
ptr 是本地指针,因此只要您不将指针传递给另一个线程,其他线程就不会干扰它。
运行此函数的两个线程将各自分配 1 个 char[25] 数组。但是线程不是所有者,而是拥有它的进程。
ptr
将重新初始化,旧内存不会在线程连接时被删除。因此,如果不使用 delete,它将泄漏内存。delete[]
最好用 yes。
说明 ptr
是由操作系统分配的,每次调用 new 都会从操作系统分配一个新的指针。 ptr
的值,即它指向的位置,是一个本地堆栈变量,因此对线程来说是本地的,只要不进行通信,其他线程就无法获得它的值。
关于c++ - Pthreads 和动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16662989/