以下是我所面临的问题的小规模示例。在下面的例子中我使用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;
}
答案 0 :(得分:4)
问题是您初始化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.
答案 1 :(得分:2)
问题是你的函数将内存分配给作为参数的指针的副本 - 这个副本在函数退出时丢失。通过引用传递指针,而不是通过更改函数签名
void initializeP1(int* &ip,int n){
^
这样分配的内存仍然可以访问,指针指向它
答案 2 :(得分:1)
将initializeP1
函数更改为以下内容会不会更容易:
int * initializeP1(int n)
{
sizeP1 = n;
p1 = new int[n];
for(int i = 0; i < n; ++i)
p1[i] = i;
return ip;
}
然而,这仍然存在问题,例如您可以反复调用它并导致大量内存泄漏。
最好为你的类使用适当的构造函数来执行initializeP1所做的操作,例如:
Test(int n)
{
sizeP1 = n;
p1 = new int[n];
for(int i = 0; i < n; ++i)
p1[i] = i;
return ip;
}
指针不是通过引用传递的,不是。指针是值类型。你想要使用引用,如果你必须使它看起来像这样,但它是滥用语法,你应该采用不同的方式。
答案 3 :(得分:0)
对t.getIntPointer()的调用返回一个未初始化为合理的指针。 对initializeP1()的调用正在新建一个int数组。 但是要小心,这个分配的内存块在你通过编写“delete [] p1;”之后才会被释放。