2012-03-05 67 views
1

我创建了一个函数来计算2个timeval函数的差异。这是该函数的基本版本。分配返回参考的空间

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;

+1

如果通过释放你的意思是做'删除c;'然后是它的安全,但如果你的意思是'free(c);'那么它不是。 – Naveen 2012-03-05 12:05:13

+0

那么如果我使用free(),风险如何? – 2012-03-05 12:08:32

+0

@PrasanthMadhavan它是未定义的行为,因为你用'new'而不是'malloc'分配。 – 2012-03-05 12:09:48

回答

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; 
} 
+0

,你可以期望NRVO将被应用。 – nodakai 2012-03-05 12:09:47

+0

@nodakai即使它不是,它是一个持有两个整数的结构。 – 2012-03-05 12:14:39

+0

少指针有...越好的代码.. :) 谢谢你的回答... – 2012-03-05 13:57:05

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是假的,你删除c这是不正确初始化。如果它被初始化为NULL,则行为被很好地定义(它什么都不做)。

0

是的,那是安全的,因为你是返回一个指向已分配结构。是的,免费的C将释放您在函数中分配的结构。顺便说一句,也许一个更好的选择是在函数外部分配一个结构,然后传递一个指针,因为你不必考虑谁分配它以及谁负责释放。

0

这将是没有意义的,甚至是有害的调用c = getDifference(...);因为调用new分配内存移动c指针时将被丢失之前调用struct timeval* c = new struct timeval;返回值为getDifference

但是,由于getDifference()分配了它的返回值,因此由调用者(main函数)来释放内存。所以是的,你必须拨打delete的回报值getDifference

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 !! 
    } 
} 
+0

给那个downvoted的人:我的回答有什么问题? – Gui13 2012-03-05 12:42:10

+0

我已upvoted ..以防万一..;) – 2012-03-05 13:55:55