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

Returning a pointer to the result of an operation +

本文关键字:结果 指针 操作 返回      更新时间:2023-10-16

我有这样的代码,它可以完美地工作:

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

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

现在,我想对一个absact类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加一个double。。。多亏了这一点,我现在可以添加两个myObject,即使忽略了指针*myObject指向的真实类型。问题是,我想得到一个指针,指向我的运算符+的结果,并返回一个myObject&。

我希望这能更清楚一点。

感谢

形式的代码行为

int* a; *a = 10;

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

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

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

假设A有一个默认构造函数,或者更简单地说是

A a;

甚至是更耀眼的

A a{};

如果自动存储持续时间足够。

您永远不要取消引用未初始化的指针 ,它会调用未定义的行为,这是邪恶的

在使用真正的变量之前,必须绝对让指针引用它们。您可以使用@Bathsheba解释的new(但不要忘记使用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创建了一个临时对象,该对象将在完整表达式结束时被销毁(当达到分号;时)。如果您影响其指向指针的地址,您将以悬挂指针结束,这意味着它指向一个可以随时覆盖的已释放内存=>再次调用Undefined Behavior