我正在尝试动态分配(它现在不是那么动态,但最终会是)非常简单C ++程序中对象的内存。我是班级新手,最近才开始玩C ++,让C落后。这是代码:
#include <iostream>
using namespace std;
class Test {
private:
int i;
public:
Test(int);
~Test();
void print();
};
Test::Test(int ii) { i = ii; }
Test::~Test() { i=0; cout << "deconstructor called...value of i= " << i << endl; }
void Test::print() { cout << "value of i= " << i << endl; }
int main()
{
Test a(10),*b,*c;
//a.print(); // this works
b = new Test(12);
//b->print(); // this works as well
for (int i=0; i<2; i++)
c = new Test(i);
c->print(); /* this shows that the value of i=1 .. should be 0? */
c[0].print(); /* as expected (I guess), this prints i=1 as well... [expected because c->print() shows i=1 also */
c[1].print(); /* shows value of i=0... */
//delete []c; /* this fails miserably, but `delete c` works, why :( */
}
我的很多困惑实际上都包含在代码本身的注释中。我基本上试图有一个数组 c ,其中数组的每个元素都是它自己的对象。
我收到的代码的行为在评论中有描述。
答案 0 :(得分:5)
给定代码几乎没有严重问题。
new
上执行*b
但错过了delete
。*c
循环中覆盖for
几次,这将泄漏
记忆。始终在分配新资源之前释放资源
指针。new/new[]/malloc
分配,那么您必须
分别用delete/delete[]/free
取消分配指针。该
同样你没有使用*c
维护(这就是它失败的原因)。此外,除了学习动态分配之外,还应该了解STL容器,它提供了处理动态资源的更好方法。例如std::vector
答案 1 :(得分:5)
也许我们应该看看声明,扩展你有:
Test a(10);
Test *b;
Test *c;
您已将b和c定义为指向测试的指针,但您似乎希望c成为指向测试的指针数组。你想要的声明很可能是:
Test **c;
你要初始化:
c = new Test*[2];
for (int i=0; i<2; i++)
c[i] = new Test(i);
您可以访问它:
c[0]->print();
c[1]->print();
答案 2 :(得分:0)
for (int i=0; i<2; i++)
c = new Test(i);
上面的代码泄漏了内存。 c
只是指向循环迭代中最后构造的对象。
C-&GT;打印(); / *这表明i = 1的值应为0?
此处c
指向new Test(1);
上构建的位置。所以,输出。
每个 new [] 都应附带删除[] 和新并带有删除。你不能混合两者。
答案 3 :(得分:0)
delete[]
不起作用是完全正常的:你从未将c作为数组分配,而是作为指针分配。您可以将数组的地址存储在指针中,但这就是全部。我实际上想知道为什么c [1]正常工作,因为你的for
循环只是在同一个指针中重复存储指向新分配对象的指针(你没有填充数组!)。
答案 4 :(得分:0)
delete c[];
仅删除起始元素。如果要删除该数组,请在for循环中使用dz delete c[]
你没有为c分配内存并继续编码错误如何在不将内存分配给指针变量的情况下获得输出?
答案 5 :(得分:0)
根据我的说法,你已经多次为* c分配内存
for (int i=0; i<2; i++)
c = new Test(i);
查看此代码,这将使一切清晰
for (int i=0; i<2; i++)
{ c = new Test(i); } /*see , here the loop goes for i=0; then
for i=1; which basically overwrites what c will have
i.e. finally c = new test(1); */
c->print(); /* works fine , gives value of i=1 */
c[0].print(); /* as expected , this prints i=1 as well... */
c[1].print(); /*clearly, it will give a garbage value */
delete c;
但据我所知,替换
会更好for (int i=0; i<2; i++)
{ c = new Test(i); }
与
c = new Test(1); //as the previous code is doing the same in for loop but that was consuming more resources
因此,如果您希望输出为i = 0然后i = 1,则执行此操作 -
c = new int(0);
c->print(); /* works fine , gives value of i=0 */
c[0].print(); /* as expected , this prints i=0 as well... */
delete c;
c = new int(1);
c->print(); /* works fine , gives value of i=1 */
c[0].print(); /* as expected , this prints i=1 as well... */
delete c;
以上代码将完全满足您的需求。