【问题标题】:C++ linux time freezes applicationC++ linux时间冻结应用程序
【发布时间】:2011-10-16 16:01:21
【问题描述】:

我正在导入 <sys/time.h> 并使用

struct time_t *start;

一个类有一个成员 time_t *start;和一个成员函数 getETA() :

template <class S, class P> 
double Task<S,P>::getETA()
{ 
  time_t *stop;
  time(stop);
  return difftime(*stop , *start);
}

还要注意 time_t *start 是在类构造函数中初始化的。

每当我调用 getETA() 时,应用程序都会冻结。 更有趣的是,我在主循环的 main.cpp 中使用了相同的结构和代码,显然它也冻结了应用程序:

int main(int argc, char **argv) 
{ 
  ...
  time_t *start;
  time(start);
  ...
}

我用错了吗?我记得很久以前在某个应用程序中,我就是这样使用它的,它运行良好。

【问题讨论】:

    标签: c++ linux time


    【解决方案1】:

    改成:

    int main(int argc, char **argv) 
    { 
      ...
      time_t start;
      time(&start);
      ...
    }
    

    问题在于该函数需要一个指向有效 time_t 的指针,但您向它传递了一个未初始化的 time_t 指针,这会导致未定义的行为。

    【讨论】:

      【解决方案2】:

      您必须将有效指针传递给time() 函数。那你为什么不这样做呢:

      time_t start;
      time(&start);
      
      time_t stop;
      time(&stop);
      

      也就是说,不要将startstop 声明为指针。将它们声明为非指针自动变量。

      如果你将它们声明为指针,那么你必须这样做:

      time_t *start = new time_t;
      time(start);
      
      time_t *stop  = new time_t;
      time(stop);
      
      //...
      
      //Must deallocate the memory when you don't need them anymore
      delete start;
      delete stop; 
      

      但我不建议这样做。我建议你使用非指针变量。

      【讨论】:

      • 谢谢你的工作。我的印象是我可以为此使用堆栈指针,但是哦,好吧。再次感谢 ! :)
      • @Alex,是的,您可以使用堆栈指针,但您必须初始化它。 time_t start; time_t* p_start = &amp;start; time(p_start); 也可以,并且使用指向堆栈变量的指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多