C++ C++;类副本(指针副本)

C++ C++;类副本(指针副本),c++,class,pointers,C++,Class,Pointers,我的理解是,当创建定义指针变量的类的副本时,会复制指针,但指针指向的数据不会被复制 我的问题是:是否可以假设本例中的“指针副本”只是实例化同一类型的新指针(动态内存分配)?例如,新指针只是一个包含任意内存地址的新分配,应该注意将新指针指向适当的内存地址 我认为这个问题有一个非常简单的答案,我为它的琐碎性道歉,但我试图在更深层次上理解指针,这是我在互联网上的研究指针上提出的 问候, Chad指针将被简单地复制为一个值-因此这两个类将指向相同的原始内存,不会发生新的分配浅复制-这是语言默认的功能 如

我的理解是,当创建定义指针变量的类的副本时,会复制指针,但指针指向的数据不会被复制

我的问题是:是否可以假设本例中的“指针副本”只是实例化同一类型的新指针(动态内存分配)?例如,新指针只是一个包含任意内存地址的新分配,应该注意将新指针指向适当的内存地址

我认为这个问题有一个非常简单的答案,我为它的琐碎性道歉,但我试图在更深层次上理解指针,这是我在互联网上的研究指针上提出的

问候,


Chad

指针将被简单地复制为一个值-因此这两个类将指向相同的原始内存,不会发生新的分配浅复制-这是语言默认的功能

如果需要分配新内存并复制数据,则必须在复制构造函数中自行完成深度复制-您必须自己完成此操作


<>编辑:这是C++的优点之一,你可以自由决定复制的工作方式。它可能是一个只对内存进行读访问的对象副本可以避免复制内存的成本。您还可以实现仅在新对象需要写入时才复制原始数据的类。

复制的指针将指向完全相同的地址。没有新的分配。

是的,指针只包含内存地址,如果您想进行更深入的复制,您需要在复制构造函数中自己编写


如果你总是通过同一个类的指针引用同一种数据,并且需要将数据与对象一起复制,那么你也可以考虑使它只是一个普通的成员,而不是指针。

首先,你的类中的指针是静态的,(也就是说,编译器知道这个类中有一个指针以及它的大小,因此在实例化该类时不需要动态内存分配)

如果复制类(并且没有定义特殊的复制构造函数),则新类中的指针将指向内存中与旧类中指针相同的位置。要澄清:

#include <iostream>

class A {
   public:
       int *p;
};

int main() {
    A a,b;
    a.p = new int(10);
    b = a;

    std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
    std::cout << "*(b.p) = " << *(b.p) << std::endl; // 10

    *(b.p) = 3;

    std::cout << "*(a.p) = " << *(a.p) << std::endl; // 3
    std::cout << "*(b.p) = " << *(b.p) << std::endl; // 3

    return 0;
}
#包括
甲级{
公众:
int*p;
};
int main(){
A,b;
a、 p=新整数(10);
b=a;

指针不会实例化动态内存分配。指针和分配是完全不同的事情

如果复制指向动态分配内存的指针,则有两个指针指向同一分配内存。由于复制了该指针,它已指向内存块。具体而言,如果使用编译器生成的复制构造函数,新指针将指向与旧指针完全相同的对象。无需如果可以的话,用它做任何事

您确实存在何时释放内存的问题。释放内存两次通常会导致堆损坏,这很严重。不释放内存会导致内存泄漏,在某些情况下这是可以接受的。在另一个指针完成之前释放内存也会导致问题。因此,拥有多个指针的人对于相同的内存,请经常访问Boost项目并使用其共享的_ptr模板(该模板将出现在即将推出的新标准中,并且在大多数最新的系统中都有)


如果您想让每个指针指向单独的内存块,您必须通过编写自己的复制构造函数,分配一个新的内存块并在其中复制必要的数据来进行设置。(出于完全相同的原因,您还需要编写自己的赋值运算符和析构函数,以便释放内存。有一条经验法则,称为三法则,即如果您需要编写自己的复制构造函数、赋值运算符或析构函数,您可能需要编写所有这些。)

指针和它们所指向的数据是分开的。马丁下面的回答应该会澄清,如果没有的话,请查看以下基本内容:@Chad Kemp:另请参见
boost::shared_ptr
和智能指针。还要研究浅拷贝和深拷贝之间的区别。完美。我感谢所有的回答!非常清楚!谢谢大家。谢谢有关可用内存损坏和共享\u ptr示例。
#include <iostream>

class A {
   public:
       int *p;

       A() : p(0) {}
       A(const A& other) { // copy constructor
           p = new int(*other.p);
       }

       A& operator=(const A& other) { // copy assignment constructor
           // protect against self assignment
           if (this != &other) {
               if (p != 0) {
                   *p = *other.p;
               } else { // p is null - no memory allocated yet
                   p = new int(*other.p);
               }
           }
           return *this;
       }

       ~A() { // destructor
           delete p;
       }
};


int main() {
    A a,b;
    a.p = new int(10);
    b = a;

    std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
    std::cout << "*(b.p) = " << *(b.p) << std::endl; // 10

    *(b.p) = 3;

    std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
    std::cout << "*(b.p) = " << *(b.p) << std::endl; // 3

    return 0;
}