在其他范围内为指针创建实例

rnd*_*gen 0 c++ pointers

我有两种方法来为指针创建实例.但其中一个会失败.

class A {
public:
    int num;
};

void testPointer1(A* a){
    a = new A();
    a->num = 10;
}
A* testPointer2(){
    A* a = new A();
    a->num = 10;
    return a;
}
void testPointer() {
    A* a1 = NULL;
    testPointer1(a1); // this one fails
    //cout << a1->num << endl; // segmentation fault

    A* a2 = NULL;
    a2 = testPointer2();
    cout << a2->num << endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么testPointer1错了?

In *_*ico 6

语法是有效的,但它不能做你想要的,因为它testPointer1()是在指针的副本上操作,而不是实际的指针本身.因此,当您将地址分配给新分配的对象时,它将被分配给副本,而不是原始a1指针.

因此,地址丢失并导致内存泄漏.此外,由于原始a1指针从未被修改过,所以您试图取消引用空指针,这是一件坏事.

我想说这testPointer2()是更好的方法,但如果你想testPointer1()工作,试试这个:

void testPointer1(A*& a)
{
    a = new A();
    a->num = 10;
} 
Run Code Online (Sandbox Code Playgroud)

参数类型表示"对指针的引用A".这样,将传递对原始指针的引用,而不是传递指针的副本.C++引用是另一个对象的别名.因此无论你对别名做什么,它都会在原始对象上执行.


额外说明:

请注意,括号中new A(); 的实际上是重要的,它们的存在与否会产生影响.

另请注意,您必须手动完成delete所有new'ed对象后,否则您将收到泄漏.通常,您可以将指针包装在自己的类中并实现RAII或使用智能指针(如Boost的智能指针),或者auto_ptr用于正确的内存管理和异常安全.

如果你要设置num初始化的值,为什么不创建一个构造函数?

class A
{
public:
    A(int n) : num(n) {}
    int GetNum() const { return num; }
private:
    int num;
};

void testPointer1(A*& a)
{
    a = new A(10);
}  

A* testPointer2()
{
    return new A(10);
}

// auto_ptr example, see link in second note above
std::auto_ptr<A> testPointer3()
{
    return auto_ptr<A>(new A(10));
} 
Run Code Online (Sandbox Code Playgroud)