返回指向操作结果的指针+

时间:2016-06-02 07:44:15

标签: c++

我有这个完美的代码:

        int* a;
        int* b;
        *a = 10;
        *b = 5;
        int *c;
        int t;
        t=*a+*b;
        c = &t;

最后,c指向t,等于15。

现在,我想用一个抽象类myObject做同样的事情。 我有:

    myObject* a;
    myObject* b;
    *a = myObject();
    *b = myObject2();
    myObject *c;
    myObject t; // Of course, this fails since myObject is an abstract class
    t=*a+*b; 
    c = &t;

为了避免创建缓冲区变量,并且能够获得指向我添加结果的指针,我已经完成了这个:

myObject* a;
myObject* b;
*a = myObject();
*b = myObject();
myObject* c;
c = &(*a+*b);

此代码完全按照我的意愿运行,但我担心此代码不合法​​。我担心*c指向的记忆可能随时被删除。这是做这个的好方法吗?

对不起如果这个问题已经发布,我一直在搜索几个小时而没有得到答案。

编辑1:似乎我没有正确解释我的问题: 我们假设myObject可以是intdoublefloat。 在创建ab时,我不知道我有哪些,这就是为什么我有一个*myObject类型的指针。 我已经定义了添加一个int与一个int,一个int与一个双...之间的所有可能的组合... 多亏了这个,我现在可以添加两个myObject,即使忽略指针*myObject指向的实际类型。 问题是我想得到一个指向我的运算符+结果的指针,并给出了一个myObject&amp ;.

我希望这更清楚一点。

由于

2 个答案:

答案 0 :(得分:2)

表单代码的行为

int* a; *a = 10;

等。 未定义a未指向您拥有的内存,因此您无法取消引用它。您的代码可能“完美地工作”,但实际上编译器保留吃猫的权利。

在C ++中,如果使用自动new存储不可行,则倾向于使用static来构造对象。 new的结果是创建类型的指针。您应该将其存储为后续delete。考虑写

A* a = new A();
/*some code*/
delete a;

假设A具有默认构造函数,或更简单地

A a;

甚至更华丽的

A a{};

如果自动存储时间足够。

答案 1 :(得分:2)

你永远不会取消引用未初始化的指针 ,它会调用 evil 的未定义行为。

在使用它们之前,您必须绝对让指针引用真实变量。您可以使用@Bathsheba解释的delete(但不要忘记int var_a; int *a = &var_a; ... ),或者只使用现有变量的地址:

A* a;
A* b;
a = new myObject();  // don't forget to delete the new allocated pointers
b = new myObject2();

使用对象时也是如此:

A c = (*a + *b);      // do define a true object

然后:

*a + *b

最后一部分是另一个问题:;创建一个临时对象,该对象将在完整表达式结束时被销毁(当达到半冒号expState时)。如果你将其地址影响到指针,你将以悬空指针结束,这意味着它指向一个可以随时被覆盖的解除分配的内存=>再次调用未定义的行为