注册 登录
编程论坛 C++教室

出错,求解决

as66760 发布于 2013-10-30 08:08, 434 次点击
#include<iostream>
struct CandyBar
{
char brand[20];
double weight;
int kaluri;
};
int main()
{   
    using namespace std;  

 CandyBar ab[3]={{"Mocha Munch",2.3,350},{"aaa",3.2,400},{"cde",5.2,200}};
 CandyBar *abc =new CandyBar[3];
 abc=ab;
 int i;
    for(i=0;i<3;i++)
{   
    cout <<"abc"<<i+1<<endl;
    cout <<" brand :"<<(abc+i)->brand;
    cout <<" weight :"<<(abc+i)->weight;
    cout <<" kaluri :"<<(abc+i)->kaluri<<".\n";
}
delete abc;
return 0;
}
7 回复
#2
peach54602013-10-30 08:09
错在何方?
#3
wp2319572013-10-30 08:28
这样呢
程序代码:
#include<iostream>

struct CandyBar
{
    char brand[20];
    double weight;
    int kaluri;
};
int main()
{  
    using namespace std;  

    CandyBar ab[3]={{"Mocha Munch",2.3,350},{"aaa",3.2,400},{"cde",5.2,200}};
    CandyBar *abc =new CandyBar[3];
    abc=ab;
    int i;
    for(i=0;i<3;i++)
    {  
        cout <<"abc"<<i+1<<endl;
        cout <<" brand :"<<(abc+i)->brand;
        cout <<" weight :"<<(abc+i)->weight;
        cout <<" kaluri :"<<(abc+i)->kaluri<<".\n";
    }
    abc=NULL;
    delete abc;
    return 0;
}


#4
peach54602013-10-30 09:03
delete abc[];
#5
wp2319572013-10-30 09:15
以下是引用peach5460在2013-10-30 09:03:13的发言:

delete abc[];
    abc=NULL;
    delete abc;

这2者之间有无区别呢
#6
rchunjiang2013-10-31 08:45
回复 楼主 as66760
其实这样就可以了
程序代码:
#include<iostream>
struct CandyBar
{
    char brand[20];
    double weight;
    int kaluri;
};
int main()
{
    using namespace std;

    CandyBar ab[3]={{"Mocha Munch",2.3,350},{"aaa",3.2,400},{"cde",5.2,200}};
    CandyBar *abc;
    abc=ab;
    int i;
    for(i=0;i<3;i++)
    {
        cout <<"abc"<<i+1<<endl;
        cout <<" brand :"<<(abc+i)->brand;
        cout <<" weight :"<<(abc+i)->weight;
        cout <<" kaluri :"<<(abc+i)->kaluri<<".\n";
    }
  return 0;
}
不需要使用new来分配动态内存,最后也就可以不用delete来释放内存。
1.原程序中
CandyBar *abc =new CandyBar[3];
表示申明了一个CandyBar类型的指针abc,并指向一块3个CandyBar大小的动态内存区,而后你又用
abc=ab;
来将指针abc指向数组ab,这样之前new得到的动态内存根本没用到,还造成内存泄漏,所以不需要使用new。
2.原程序中使用
delete abc;
出错的原因在于,abc已经被
abc=ab;
这一句指向了ab所在的内存区,而ab不是用new得到的动态内存,故不能使用delete来释放,之前用new得到的动态内存我们已经不知道地址了,所以没法释放。
你把程序改成
CandyBar *abc =new CandyBar[3];
delete abc;
abc=ab;
也能正确运行的,不要在使用了new过后使用abc=NULL。
#7
blueskiner2013-10-31 08:48
new xxx[];?
xxx=ab;?
delete xxx?..............................笑而不语
#8
peach54602013-10-31 11:06
以下是引用blueskiner在2013-10-31 08:48:08的发言:

new xxx[];?
xxx=ab;?
delete xxx?..............................笑而不语

哈哈...我之前没注意上面还有个赋值咧...
1