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::cout
arg
不是一个
Data
,它是一个
Data*
数据
可能比
void*
大,而且无论如何都不能适应。我不知道你在谈论关于C++11的什么。它在Windows 8上运行得很好。
someFunction()
您可以将
d
放入智能指针中,或者确保在函数返回时
删除它
make
d
a
Data*
并使用
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:::线程,例如,它们是否都被用于相同的用途?谢谢。