C++ 如果希望变量在超出范围后保持不变,那么在哪里调用delete?
所以说我们有C++ 如果希望变量在超出范围后保持不变,那么在哪里调用delete?,c++,dynamic,pthreads,new-operator,C++,Dynamic,Pthreads,New Operator,所以说我们有 struct Data { int x; int y; int z; } void doWork() { Data d; d.x = 1; d.y = 2; d.z = 3; pthread_t thrd; pthread_create(&thrd, NULL, someFunction, (void*)&d); } pthread_mutex_t outputLock = PTHREAD_MUTEX_INITIALIZER;//g
struct Data
{
int x;
int y;
int z;
}
void doWork()
{
Data d;
d.x = 1;
d.y = 2;
d.z = 3;
pthread_t thrd;
pthread_create(&thrd, NULL, someFunction, (void*)&d);
}
pthread_mutex_t outputLock = PTHREAD_MUTEX_INITIALIZER;//global scope
void* someFunction(void* arg)
{
Data d = (Data*)arg;
pthread_mutex_lock(&outputLock);
std::cout << d->x->d->y+d->z;
pthread_mutex_unlock(&outputLock);
}
struct数据
{
int x;
int-y;
intz;
}
无效销钉()
{
数据d;
d、 x=1;
d、 y=2;
d、 z=3;
pthread_t thrd;
pthread_创建(&thrd,NULL,someFunction,(void*)&d);
}
pthread\u mutex\u t outputLock=pthread\u mutex\u初始值设定项//全球范围
void*someFunction(void*arg)
{
数据d=(数据*)参数;
pthread_mutex_lock(&outputLock);
标准:曲线x->d->y+d->z;
pthread_mutex_unlock(&outputLock);
}
这会导致未定义的行为,因为doWork()将参数返回给someFunction()后,它就会损坏。为了解决这个问题,我做了
Data*d=新数据()代码>
我的问题是,既然我没有调用delete
,我是否需要担心内存泄漏?当程序结束时,它会自动清除任何内存泄漏吗
遗憾的是(据我所知),C++11无法在Windows 8上开发(因为Cygwin似乎有很多bug)。您可以这样做:
struct Data
{
int x;
int y;
int z;
}
void doWork()
{
Data* dat = new Data;
dat->x = 1;
dat->y = 2;
dat->z = 3;
pthread_t thrd;
if(pthread_create(&thrd, NULL, someFunction, (void*)dat) != 0)
delete dat; // if thread not created need to cleanup here
}
void* someFunction(void* arg)
{
Data* d = (Data*)arg;
std::cout << d->x->d->y+d->z;
delete d;
}
void* someFunction(void* arg)
{
// From C++11 use std::unique_ptr
std::auto_ptr<Data> d(reinterpret_cast<Data*>(arg)); // C++ style cast
std::cout << d->x->d->y+d->z;
}
struct数据
{
int x;
int-y;
intz;
}
无效销钉()
{
Data*dat=新数据;
dat->x=1;
dat->y=2;
dat->z=3;
pthread_t thrd;
if(pthread_create(&thrd,NULL,someFunction,(void*)dat)!=0)
delete dat;//如果未创建线程,则需要在此处清理
}
void*someFunction(void*arg)
{
数据*d=(数据*)参数;
标准:曲线x->d->y+d->z;
删除d;
}
或(更好)使用智能指针:
struct Data
{
int x;
int y;
int z;
}
void doWork()
{
Data* dat = new Data;
dat->x = 1;
dat->y = 2;
dat->z = 3;
pthread_t thrd;
if(pthread_create(&thrd, NULL, someFunction, (void*)dat) != 0)
delete dat; // if thread not created need to cleanup here
}
void* someFunction(void* arg)
{
Data* d = (Data*)arg;
std::cout << d->x->d->y+d->z;
delete d;
}
void* someFunction(void* arg)
{
// From C++11 use std::unique_ptr
std::auto_ptr<Data> d(reinterpret_cast<Data*>(arg)); // C++ style cast
std::cout << d->x->d->y+d->z;
}
void*someFunction(void*arg)
{
//从C++11使用std::unique\u ptr
STD::AutoPPTR D(RealTytCube(ARG));/C++风格的铸件
标准:曲线x->d->y+d->z;
}
注意:std::auto_ptr
在C++11中被std::unique_ptr
取代是的,您必须担心内存泄漏。解决方案之一是在<代码>结尾> <函数> <代码> > < /p> < p> >对应于您的代码的C++答案将使用<代码> <代码>:
#包括
#包括
结构数据{intx;inty;intz;};
void函数(数据常量和数据)
{
std::coutarg
不是一个Data
,它是一个Data*
数据
可能比void*
大,而且无论如何都不能适应。我不知道你在谈论关于C++11的什么。它在Windows 8上运行得很好。someFunction()
您可以将d
放入智能指针中,或者确保在函数返回时删除它
maked
aData*
并使用new
创建它。将其传递到线程参数。@chris re windows 8如果您知道如何使其工作,请告诉我,如果MinGW修复程序工作正常,我不会感到惊讶。不过,我不知道。我使用了Clang和MinGW。Visual Studio为windows编译了大部分c++11。我注意到您使用了标识符d
位于两个位置。当您调用delete d
时,它指的是哪个d
呢?如果它指的是someFunction()
范围内的标识符,那么是否还有内存泄漏?@Celeritas没有内存泄漏。它指的是someFunction()中定义的d
并且在someFunction()
处理完后,它会被删除。@remyabel因为问号中没有C++11,但我准备添加它作为更好的选项。@Galik“它指的是someFunction()中定义的d”这不是一个问题吗,因为在doWork中调用了new
?是不是两个变量都指向同一个地址?@Celeritas是的。指针被复制(其值)从dat
到d
但不是它指向的对象。因此d
指向其地址分配给dat
的同一对象。当doWork()时
超出范围指针dat
已被销毁,但它指向的对象仍然存在。它的地址现在存储在d
中,可以从中删除。如果父线程提前退出,则某些函数中的指针甚至在开始执行之前就可能损坏。是的,但我们在这里讨论的是Data*d=new Data();
。这样它就不会损坏。我认为OP只对C++11之前的版本感兴趣stuffs@CeleritasPthOrthPosix是POSIX标准的一部分, < /Cord>是C++标准的一部分。@ KerrekSB,我想问的是,如何决定使用pToSsvs STD:::线程,例如,它们是否都被用于相同的用途?谢谢。