他说为初始化P,但我想在主函数调用我想用的数组,这个应该咋改
两种方法,一种是关闭生命周期检查。另一种是将p初始化为nullptr
很明显,你的程序设计的内存管理思想有问题。C++一般是秉承谁申请内存,谁负责释放。既然传入Set的数组是通过实参传递给其成员pSet,那么就不应该由Set释放其内存,而是由Set调用者(构造函数的调用者,是main函数)负责。
实参int a[]是存储在栈上的,无需显式释放,退出main函数时会自动释放内存。
1)如果你只是想通过Set打印数组,那么像下面这样做就可以了
class Set {
private:
int* pSet;
int cnt;
public:
Set(int* p, int a)
: pSet(p),
cnt(a)
{
}
void print()
{
for (int i = 0; i < cnt; ++i)
{
std::cout << pSet[i];
if (i < cnt - 1)
std::cout << " ";
}
std::cout << std::endl;
}
};
int main()
{
int a[] = { 1,2,3,4,5 };
int b;
std::cin >> b;
Set s(a, b);
s.print();
return 0;
}
2)如果你想深度拷贝数组内容
就可以为Set::pSet动态申请内存,在析构函数中释放。但Set仅限于管理自己申请的内存。
class Set {
private:
int* pSet;
int cnt;
public:
Set(int* p, int a)
: cnt(a)
{
if (!p || a <= 0) return;
pSet = new int[a];
std::copy(p, p+a, pSet); // 拷贝p所有元素(p[0]..p[a-1])
}
~Set()
{
delete[] pSet;
}
void print()
{
for (int i = 0; i < cnt; ++i)
{
std::cout << pSet[i];
if (i < cnt - 1)
std::cout << " ";
}
std::cout << std::endl;
}
};