我有这段代码:
#include<iostream>
class Test {
private:
int iNum;
int *ptr;
public:
Test(int iFirst, int iSecond);
void setNum(int iValue);
int getNum();
int getFirstNum();
int getSecondNum();
};
Test::Test(int iFirst, int iSecond) {
int *ptr = (int *)malloc(sizeof(int) * 2);
ptr[0] = iFirst;
ptr[1] = iSecond;
}
void Test::setNum(int iValue) {
iNum = iValue;
}
int Test::getNum() {
return iNum;
}
int Test::getFirstNum() {
return ptr[0];
}
int Test::getSecondNum() {
return ptr[1];
}
int main() {
Test oTest(3,4);
std::cout << oTest.getFirstNum() << std::endl;
return 0;
}
当我尝试使用getFirstNum()方法返回ptr [0]时,我只是不明白为什么我会得到垃圾值。请告诉我这在内存中的表现以及修复它的可能方法。谢谢你
答案 0 :(得分:2)
你的错误在你的构造函数中:
int *ptr = (int *)malloc(sizeof(int) * 2);
在这里,您要声明一个名为ptr
的变量。但是,您已经有一个名为ptr
的变量作为您的类的成员。这称为 shadowing 。您的编译器将始终使用具有最窄范围的变量版本,在本例中是您在构造函数中声明的那个。当构造函数返回时,它会被抛弃,而类中的ptr
永远不会被触及。
要解决此问题,请不要重新声明变量:
ptr = (int *)malloc(sizeof(int) * 2);
答案 1 :(得分:2)
int *ptr = (int *)malloc(sizeof(int) * 2);
在内部构造函数中,您创建了一个新指针ptr
,从而遮蔽了类成员ptr
。由于它是一个新指针,因此您的班级成员ptr
永远不会被初始化。从此行中删除int *
,这将初始化类成员ptr
。
ptr = (int *)malloc(sizeof(int) * 2);
另一件事是因为你为ptr
动态分配内存,你必须在析构函数中删除它。否则你会泄漏内存。
答案 2 :(得分:-1)
#include<iostream>
class Test {
private:
int iNum;
int *ptr;
public:
Test(int iFirst, int iSecond);
~Test();
void setNum(int iValue);
int getNum();
int getFirstNum();
int getSecondNum();
};
Test::Test(int iFirst, int iSecond) {
ptr = new int[2];
ptr[0] = iFirst;
ptr[1] = iSecond;
}
Test::~Test()
{
delete[] ptr;
}
void Test::setNum(int iValue) {
iNum = iValue;
}
int Test::getNum() {
return iNum;
}
int Test::getFirstNum() {
return ptr[0];
}
int Test::getSecondNum() {
return ptr[1];
}
int main() {
Test oTest(3, 4);
std::cout << oTest.getFirstNum() << std::endl;
return 0;
}
你将它视为c,而不是c ++。我修复了我看到的问题,你使用的是malloc而不是new,而且你正在创建一个新的int * ptr并且没有使用成员,因此当你在getter函数中调用它时它无效。
也是一个析构函数并删除内存。