返回指向操作+的结果的指针
Returning a pointer to the result of an operation +
我有这样的代码,它可以完美地工作:
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
可以是int
、double
或float
。我不知道在创建a
和b
时我有哪一个,这就是为什么我有一个类型为*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
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用指向整数的指针时获得不同的结果
- 指针数组中的意外结果
- 使用指针访问数组元素时出现意外结果
- C++数组和指针的大小的结果
- C++ 函数指针的计算结果为 1
- 对象指针打印结果以相反的顺序进行
- 使用 OpenCV 原始指针和 lambda 作为直方图的不同结果
- 插入指针数组会删除上一个结果
- 打印整数指针元素时的结果不同
- 错误:通过指针显示重复的结果
- 当应该删除其目标时,为什么此智能指针给出正确的结果
- 为什么我得到这个字符指针的不同结果?
- 在我的C++链表实现中取消引用节点指针,给出意想不到的结果
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- Cout删除了(未签名的字符)指针,给了我意外的结果
- 为什么无法将 std::bind 的结果分配给函数指针
- 如何否定MEM_FN创建的功能指针的结果
- 返回指向操作+的结果的指针
- 为什么在同一类中使用不同的(共享_ptr和正常)指针构造函数,我会得到不同的结果