我有这个完美的代码:
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
可以是int
,double
或float
。
在创建a
和b
时,我不知道我有哪些,这就是为什么我有一个*myObject
类型的指针。
我已经定义了添加一个int与一个int,一个int与一个双...之间的所有可能的组合...
多亏了这个,我现在可以添加两个myObject,即使忽略指针*myObject
指向的实际类型。
问题是我想得到一个指向我的运算符+结果的指针,并给出了一个myObject&amp ;.
我希望这更清楚一点。
由于
答案 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
时)。如果你将其地址影响到指针,你将以悬空指针结束,这意味着它指向一个可以随时被覆盖的解除分配的内存=>再次调用未定义的行为