我创建了一个函数来计算2个时间函数的差异。这是该功能的基本版本。
struct timeval* getDifference(struct timeval* startTime, struct timeval* finishTime)
{
struct timeval* difference = new struct timeval;
difference->tv_sec = finishTime->tv_sec - startTime->tv_sec;
difference->tv_usec = finishTime->tv_usec - startTime->tv_usec;
return difference;
}
int main()
{
struct timeval a,b;
struct timeval* c;
gettimeofday(&a, NULL);
usleep(100000);
gettimeofday(&b, NULL);
c = getDifference(&a, &b);
}
我想知道的是使用struct timeval* c;
是否安全?还是应该像struct timeval* c = new struct timeval;
?
如果它是安全的,那么会释放c
释放在函数内分配的difference = new struct timeval;
吗?
答案 0 :(得分:3)
我建议不要在你的情况下使用指针。让参数成为引用,并复制返回值:
struct timeval getDifference(const struct timeval& startTime, const struct timeval& finishTime)
{
struct timeval difference;
difference.tv_sec = finishTime.tv_sec - startTime.tv_sec;
difference.tv_usec = finishTime.tv_usec - startTime.tv_usec;
return difference;
}
答案 1 :(得分:1)
这是安全的(在这种情况下),是的,它将释放由getDifference
分配的内存(如果您实际调用delete
)。
但是,您应该习惯初始化指向NULL
的指针 - 除非您可以将它们初始化为其他值。例如,在以下情况中,行为未定义:
struct timeval a,b;
struct timeval* c;
gettimeofday(&a, NULL);
usleep(100000);
gettimeofday(&b, NULL);
if ( someCondition )
c = getDifference(&a, &b);
delete c;
如果someCondition
为false,则表示您正在删除未正确初始化的c
。如果它被初始化为NULL
,则行为定义明确(它什么都不做)。
答案 2 :(得分:0)
是的,这是安全的,因为您正在返回指向已分配结构的指针。是的,自由c将释放你在函数中分配的结构。顺便说一句,也许更好的选择是在函数外部分配一个结构,然后将指针传递给它,因为你不必考虑谁分配它以及谁负责释放。
答案 3 :(得分:0)
在调用struct timeval* c = new struct timeval;
之前调用c = getDifference(...);
会毫无意义甚至是有害的,因为对new
的调用会分配在将c
指针移动到时会丢失的内存getDifference
的返回值。
但是,由于getDifference()
分配了它的返回值,因此由调用者(main
函数)来释放内存。是的,您必须在delete
的返回值上调用getDifference
。
答案 4 :(得分:0)
是的,它是安全的,但一般来说,你会想避免在一个函数中分配内存而在另一个函数中释放()它。
我建议更改原型我们的getDifference
函数以指示时差:
int getDifference(struct timeval* startTime, struct timeval* finishTime,
struct timeval *difference)
现在你的主要行为就像这样:
int getDifference(struct timeval* startTime, struct timeval* finishTime, struct timeval *difference)
{
if( difference && startTime && finishTime) {
difference->tv_sec = finishTime->tv_sec - startTime->tv_sec;
difference->tv_usec = finishTime->tv_usec - startTime->tv_usec;
return 0;
}
return -1;
}
int main()
{
struct timeval a,b;
struct timeval c;
gettimeofday(&a, NULL);
usleep(100000);
gettimeofday(&b, NULL);
if( getDifference(&a, &b, &c) == 0 )
{
// success !!
}
}