C++ C++;类指针未保存任何内容。

C++ C++;类指针未保存任何内容。,c++,class,pointers,C++,Class,Pointers,下面是我所面临问题的一个小规模例子。在下面的示例中,我使用int指针,但在我自己的代码中,我实际上使用指向另一个类(节点类)的指针。 问题似乎是我使用的是按值指针调用(如果有这样的情况)。我不知道,我以为指针是参考的我确实需要能够将多个指针传递给该方法,并且我不想为每个指针编写特定的方法当然,当我运行代码时,会出现某种错误,因为它试图访问尚未分配的指针。 我不明白,如果我传递我想要的特定指针,为什么它不会初始化正确的指针 任何帮助都将不胜感激 #include <iostream>

下面是我所面临问题的一个小规模例子。在下面的示例中,我使用int指针,但在我自己的代码中,我实际上使用指向另一个类(节点类)的指针。

问题似乎是我使用的是按值指针调用(如果有这样的情况)。我不知道,我以为指针是参考的
我确实需要能够将多个指针传递给该方法,并且我不想为每个指针编写特定的方法
当然,当我运行代码时,会出现某种错误,因为它试图访问尚未分配的指针。 我不明白,如果我传递我想要的特定指针,为什么它不会初始化正确的指针

任何帮助都将不胜感激

#include <iostream>

using namespace std;

class Test {
  private:
    int *p1;   
    int *p2;
    int sizeP1;
    int sizeP2;   
  public:
    int* getIntPointer() {return p1;}
    void initializeP1(int *ip,int n){
        sizeP1=n; 
        ip=new int[n];

        for(int i=0;i<n;i++)
            p1[i]=i;         
    }  
    void printP1() {
        for(int i=0;i<sizeP1;i++)
            cout<<p1[i]<<" "; 
    }
};

int main() {
    Test t;
    t.initializeP1(t.getIntPointer(),10);
    t.printP1(); //this fails.. but why? How can I fix it?

    return 0;
}
#包括
使用名称空间std;
课堂测试{
私人:
int*p1;
int*p2;
int sizeP1;
int sizeP2;
公众:
int*getIntPointer(){return p1;}
无效初始值EP1(int*ip,int n){
sizeP1=n;
ip=新整数[n];

对于(int i=0;i而言,问题在于函数将内存分配给作为参数的指针副本-此副本在函数退出时丢失。请改为通过更改函数签名通过引用传递指针

  void initializeP1(int* &ip,int n){
                         ^

这样分配的内存仍然可以访问,指针将指向它。问题是,函数将内存分配给作为参数的指针副本-此副本在函数退出时丢失。请通过更改函数签名,通过引用传递指针

  void initializeP1(int* &ip,int n){
                         ^

这样分配的内存仍然可以访问,指针将指向它

void initializeP1(int **ip,int n){
        sizeP1=n; 
        *ip=new int[n];

        for(int i=0;i<n;i++)
            *ip[i]=i;         
    }  
//call with p1

initializeP1(&p1, 10); // pass pointer to pointer so you can get return value.
void初始化1(int**ip,int n){
sizeP1=n;
*ip=新整数[n];

对于(int i=0;i而言,问题在于初始化
ip
并填充
p1

void initializeP1(int **ip,int n){
        sizeP1=n; 
        *ip=new int[n];

        for(int i=0;i<n;i++)
            *ip[i]=i;         
    }  
//call with p1

initializeP1(&p1, 10); // pass pointer to pointer so you can get return value.
void初始化1(int**ip,int n){
sizeP1=n;
*ip=新整数[n];

对于(int i=0;i将
initializeP1
函数更改为类似以下内容是否更容易:

int * initializeP1(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}
int*初始化EP1(int n)
{
sizeP1=n;
p1=新整数[n];
对于(int i=0;i
但是,这仍然存在一些问题,例如,您可以重复调用它,并导致大内存泄漏

最好为您的类使用一个合适的构造函数来完成initializeP1所做的工作,例如:

Test(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}
测试(int n)
{
sizeP1=n;
p1=新整数[n];
对于(int i=0;i

指针不是通过引用传递的,不是。指针是值类型。如果一定要使其看起来像这样,您可能会希望使用引用,但这是对语法的滥用,您应该用不同的方式来实现。将
initializeP1
函数更改为类似以下内容会更容易吗

int * initializeP1(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}
int*初始化EP1(int n)
{
sizeP1=n;
p1=新整数[n];
对于(int i=0;i
但是,这仍然存在一些问题,例如,您可以重复调用它,并导致大内存泄漏

最好为您的类使用一个合适的构造函数来完成initializeP1所做的工作,例如:

Test(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}
测试(int n)
{
sizeP1=n;
p1=新整数[n];
对于(int i=0;i

指针不是通过引用传递的,不是。指针是值类型。如果一定要使其看起来像这样,您可能会希望使用引用,但这是对语法的滥用,您应该用不同的方式来执行。

对t.getIntPointer()的调用返回一个未初始化为合理值的指针。 对initializeP1()的调用正在新建一个int数组。
但是要小心,除非您通过写入“delete[]p1;”来告诉它,否则分配的内存块不会被释放。

对t.getIntPointer()的调用将返回一个未初始化为合理值的指针。 对initializeP1()的调用正在新建一个int数组。
但是要小心,这个分配的内存块不会被释放,除非您通过写入“delete[]p1.

我不确定如何在这里正确地进行语法突出显示,但我确实将其更改为上面的显示方式。唯一的区别是我的initializeP1方法在类中,我调用它就像您在主方法中显示的那样。但是,我像这样传入p1。int*p=t.getIntPointer();t.initializeP1(&p,10);我不确定如何在这里正确地进行语法突出显示,但我确实将其更改为上面的显示方式。唯一的区别是我的initializeP1方法在类中,我调用它就像在main方法中显示的那样。但是,我像这样传入了p1。int*p=t.getIntPointer();t.initializeP1(&p,10);