C ++悬空指针/深拷贝/浅拷贝混乱

问题描述 投票:1回答:1

我听说当我们将相同的地址分配给两个不同的指针时会出现悬挂指针问题。这是因为两个指针都指向相同的内存位置,并且如果使用一个指针中的地址释放了内存;仍然可以从第二个指针(甚至从第一个指针访问,如果未设置为null,则我不在讨论这种情况)。

在下面的代码中,我尝试了不同的方案,在这些方案中应将相同的内存位置分配给不同的指针,但是显然,在每种情况下,它都在分配新的内存。为什么会这样呢?在每种情况下,都会创建深层副本。

#include<iostream>

using namespace std;

class Player
{
    public:
        char * name;
        char * countryName;
        char * gameName;
        int age;

        Player()
        {
        }

        Player(char * n, char * c, char * g,int a)
        {
            name=n;
            countryName=c;
            gameName=g;
            age=a;
        }
};


void printAddresses(Player p,Player p3)
{
    cout<<endl<<&p3<<endl<<&p<<endl;
    cout<<endl<<&p3.name<<endl<<&p.name<<endl;
    cout<<endl<<&p3.countryName<<endl<<&p.countryName<<endl;
    cout<<endl<<&p3.gameName<<endl<<&p.gameName<<endl;
    cout<<endl<<&p3.age<<endl<<&p.age<<endl;
}

int main()
{
    Player *p2=new Player;

    Player *p4=p2;

    // p2 is a pointer and p4 is also a pointer initialized from p2. But the following function prints the memory addresses, and it shows that both objects have different memory addresses. And data members also have different memory locations
    printAddresses(*p4,*p2);

    return 0;
}

我还尝试了很多方案来初始化指针。但是在每种情况下,它们似乎都有单独的内存地址,并且相应的数据成员也都有不同的内存地址。

因此,在这种情况下可能会出现悬空指针问题?或者如何在此处进行浅表复制?这个c ++ standard / version(写在下面)的行为是这样的还是我缺少什么?

OS:Linux Mint 15

g ++ --version]的输出:]

g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.

我听说当我们将相同的地址分配给两个不同的指针时会出现悬挂指针问题。这是由于两个指针都指向相同的内存位置,并且如果使用地址来释放内存...

c++ memory-management g++ shallow-copy dangling-pointer
1个回答
2
投票

问题是,您正在传递价值。因此,您的参数有自己的地址,与您的指针不同。您想要通过指针或引用传递:

© www.soinside.com 2019 - 2024. All rights reserved.