C ++正确的取消引用方式和赋值指针

时间:2014-07-11 20:10:57

标签: c++ pointers

假设我只想要一个将指针作为参数,取消引用它,然后使其等于新实例化的类的函数。

例如:

class MyClass {
    MyClass(int v) {value = v;}

    int value;
}

Set_New_Class(MyClass *x) {
    *x = *( new MyClass(1) );       // Messy!!
}

困扰我的是最后一行......对我而言,这似乎很混乱,事实上,我甚至不确定这是否是正确的做法......

我的方法有什么问题,在c ++中这样做的正确方法是什么?

6 个答案:

答案 0 :(得分:4)

Set_New_Class这样的函数真的没用。只需创建另一个构造函数,默认情况下将{1}分配给value

class MyClass 
{
    MyClass(int v) : value(v) {} 
    MyClass() : value(1) {}

    int value;
};

然后

MyClass x;
一般来说,

会给你我想要的东西。如果先前已定义x并且您想要重新定义它,那么

x = MyClass();

会这样做。

答案 1 :(得分:3)

您的解决方案的问题在于它使用new动态创建一个对象,然后从该对象复制,使该对象在以太网中保持不变。也就是说,你有内存泄漏。

相反,您应该只创建一个临时对象并将其分配给您传入的对象:

void Set_New_Class(MyClass *x) {
    *x = MyClass(1);
}

然而,raw pointers are usually not the best choice,在这种情况下,我们可以使用引用类型:

void Set_New_Class(MyClass& x) {
    x = MyClass(1);
}

但是,我发现像这样的输出参数通常是不必要的,所以我建议更好的解决方案是实际返回新对象并将其分配给x外部:

MyClass Get_New_Class() {
    return MyClass(1);
}

// Somewhere else:
x = Get_New_Class();

当然,如果你真的需要做一些复杂的事情来创建新对象,那么根本就需要一个函数。如果没有,请执行以下操作:

x = MyClass(1);

答案 2 :(得分:2)

C ++中的指针按值传递。因此,如果要以这种方式分配指针,则需要将指针传递给该指针:

void Set_New_Class(MyClass **x) {
    *x = new MyClass(1);
}

否则在函数之外,它仍将保留其旧值。

注释提到的一个注意事项是,以这种方式替换先前的值会导致内存泄漏,应该一起避免这种方法。

答案 3 :(得分:0)

如果您的编译器支持C ++ 11,您可以利用智能指针,特别是unique_ptr

#include <iostream>
#include <memory>

class MyClass {
  int value;
public:
  MyClass(int v) {value = v;}
  int getvalue() const { return value; }
};

void Set_New_Class(std::unique_ptr<MyClass> &x) {
  x.reset(new MyClass(1)); // safe old memory is deleted
}

int main() {
  std::unique_ptr<MyClass> x(new MyClass(2));
  std::cout << x->getvalue() << std::endl;
  Set_New_Class(x);
  std::cout << x->getvalue() << std::endl;
}

LIVE DEMO

这样您就不必担心删除已分配的内存和内存泄漏。

答案 4 :(得分:0)

由于通过new分配,您的主要内存泄漏:

*x = *( new MyClass(1) ); 

您可以使用

解决此问题
*x = MyClass(1); 

然而,通过引用或指针获取(返回)值仍然是丑陋的。因此,将它留给返回值优化(复制省略)和/或构造函数(r值引用),它变为:

MyClass new_class() { return MyClass(1); }

这很简单有效。

答案 5 :(得分:0)

'new'已经返回一个指针,所以你需要做的就是:

*x = new MyClass(1);