为返回的引用分配空间

时间:2012-03-05 11:59:33

标签: c++ pointers

我创建了一个函数来计算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;吗?

5 个答案:

答案 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 !!
    }
 }