| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 669 人关注过本帖
标题:new 的使用,能运行但不知为何会弹出Dug Assertion Failed!
只看楼主 加入收藏
A306452792
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2010-8-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
new 的使用,能运行但不知为何会弹出Dug Assertion Failed!
程序代码:
#include <iostream>
using namespace std;

class Book
{
private:
    int pages;
         double price;
    char *bookname, *authors,*publishing_house;
public:
    Book(){
    bookname=new char[50];
    authors=new char[50];   
    publishing_house=new char[50];   
    }
    ~Book(){
    delete[](bookname);(bookname)=NULL;
    delete[]authors;(authors)=NULL;
    delete[]publishing_house;(publishing_house)=NULL;


    }
    void getXxx();
    void setXxx(char *b,char *a,int pa,char*p, double pr);
};
void Book::setXxx(char *b,char *a,int pa,char*p, double pr){
bookname=b;
authors=a;
pages=pa;
publishing_house=p;
price=pr;
}

void Book::getXxx(){
    cout<<"书名:"<<bookname<<" 作者:"<<authors<<" 页数:"<<pages<<""<<" 出版社: "<<publishing_house<<" 价格:"<<price<<endl;
}

int main()
{
    cout<<"定义的两本书的信息:"<<endl;
  Book mybook;
  mybook.setXxx("《C++程序设计》","谭浩强编著",485,"清华大学出版社",36.00);
    mybook.getXxx();
    cout<<endl;
mybook.setXxx("《吹牛大王历险记》","拉斯伯等编著",149,"天津人民出版社",12.80);
    mybook.getXxx();

 
    return 0;
}
搜索更多相关主题的帖子: Failed 
2011-03-30 22:06
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:5 
用字符串的搞搞
#include <iostream>
//#include <windows.h>
#include <string>
using namespace std;

class Book
{
private:
    int pages;
    double price;
    //char *bookname, *authors,*publishing_house;
    string s1,s2,s3;
public:
    Book(){
   //  bookname=new char[50];
    // authors=new char[50];   
   //  publishing_house=new char[50];   
    }
    ~Book(){
   // delete[] bookname;//(bookname)=NULL;
   // delete[] authors;//(authors)=NULL;
   // delete[] publishing_house;//(publishing_house)=NULL;
    }
    void getXxx();
    //void setXxx(char *b,char *a,int pa,char*p, double pr);
    void setXxx(string s1,string s2,int pa,string s3, double pr);
};
void Book::setXxx(string b,string a,int pa,string p, double pr){
s1=b;
s2=a;
pages=pa;
s3=p;
price=pr;
}

void Book::getXxx(){
    cout<<"书名:"<<s1
        <<"作者:"<<s2
        <<"页数:"<<pages<<"页 "
        <<"出版社: "<<s3<<" 价格:"<<price
        <<endl;
}

int main()
{
    cout<<"定义的两本书的信息:"<<endl;
    Book mybook;
    mybook.setXxx("《C++程序设计》","谭浩强编著",485,"清华大学出版社",36.00);
    mybook.getXxx();
    cout<<endl;
    mybook.setXxx("《吹牛大王历险记》","拉斯伯等编著",149,"天津人民出版社",12.80);
    mybook.getXxx();
//    Sleep(5000);

    return 0;
}

2011-03-30 23:35
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
再改一次,呵呵:,在析构函数中先判断指针是否为空了再释放
#include <iostream>
using namespace std;

class Book
{
private:
    int pages;
         double price;
    char *bookname;
    char *authors;
    char *publishing_house;
public:
    Book(){
    bookname=new char[50];
    authors=new char[50];   
    publishing_house=new char[50];   
    }
    ~Book(){
        if(!bookname)
            delete[] bookname;//(bookname)=NULL;
        if(!authors)
            delete[] authors;//(authors)=NULL;
        if(!publishing_house)
            delete[] publishing_house;//(publishing_house)=NULL;
    }
    void getXxx();
    void setXxx(char *b,char *a,int pa,char*p, double pr);
};
void Book::setXxx(char *b,char *a,int pa,char*p, double pr){
bookname=b;
authors=a;
pages=pa;
publishing_house=p;
price=pr;
}

void Book::getXxx(){
    cout<<"书名:"<<bookname<<" 作者:"<<authors<<" 页数:"<<pages<<"页 "<<" 出版社: "<<publishing_house<<" 价格:"<<price<<endl;
}

int main()
{
    cout<<"定义的两本书的信息:"<<endl;
  Book mybook;
  mybook.setXxx("《C++程序设计》","谭浩强编著",485,"清华大学出版社",36.00);
    mybook.getXxx();
    cout<<endl;
mybook.setXxx("《吹牛大王历险记》","拉斯伯等编著",149,"天津人民出版社",12.80);
    mybook.getXxx();
   
//    Sleep(5000);
    return 0;
}

2011-03-30 23:40
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
又想到了,你传进去的就是一个字符串的指针所以定义的字符指针不用分配空间,直接用那个指针变量就可以了
#include <iostream>
using namespace std;

class Book
{
private:
    int pages;
         double price;
    char *bookname;
    char *authors;
    char *publishing_house;
public:
    Book(){
//    bookname=new char[50];
  //  authors=new char[50];   
    //publishing_house=new char[50];   
    }
    ~Book(){
//        if(!bookname)
//            delete[] bookname;//(bookname)=NULL;
//        if(!authors)
//            delete[] authors;//(authors)=NULL;
//        if(!publishing_house)
//            delete[] publishing_house;//(publishing_house)=NULL;
    }
    void getXxx();
    void setXxx(char *b,char *a,int pa,char*p, double pr);
};
void Book::setXxx(char *b,char *a,int pa,char*p, double pr){
bookname=b;
authors=a;
pages=pa;
publishing_house=p;
price=pr;
}

void Book::getXxx(){
    cout<<"书名:"<<bookname<<" 作者:"<<authors<<" 页数:"<<pages<<"页 "<<" 出版社: "<<publishing_house<<" 价格:"<<price<<endl;
}

int main()
{
    cout<<"定义的两本书的信息:"<<endl;
  Book mybook;
  mybook.setXxx("《C++程序设计》","谭浩强编著",485,"清华大学出版社",36.00);
    mybook.getXxx();
    cout<<endl;
mybook.setXxx("《吹牛大王历险记》","拉斯伯等编著",149,"天津人民出版社",12.80);
    mybook.getXxx();
   
//    Sleep(5000);
    return 0;
}

2011-03-30 23:52
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
把 char *bookname, *authors,*publishing_house;三个成员改成
char bookname[50];
char authors[50];
char publishing_house[50] 就可以了,没有必要用new在堆中申请内存 (最好还是不要用50,用64,也就是2的N次方的值)

不管怎么 这个函数都是不合法的
void Book::setXxx(char *b,char *a,int pa,char*p, double pr){
bookname=b; // strcpy(bookname,b);
authors=a;
pages=pa;
publishing_house=p;
price=pr;
}

应该改成用strcopy拷贝过去。


我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-03-31 00:04
A306452792
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2010-8-18
收藏
得分:0 
我想到了,好像直接把那个析构函数放在void setXxx()函数之后就行了,因为构造函数刚分配地址,void setXxx()还没使用就用析构函数删除了内存,导致的错误吧.
2011-03-31 11:27
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:5 
尽量用string而不要用C-style字符串。

我们都在路上。。。。。
2011-03-31 12:04
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回 6 楼。你理解还是有错误
void setXxx() 把栈分配的内存交给了bookname 等成员,在对象析构的时候,调用了delete bookname;也就是delete了一个栈的内存空间。也就是错误的根本原因

如果你对内存管理足够理解,你怎么用都没有关系的

建议你还是先学习下堆栈内存的分配差别吧

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-03-31 13:03
A306452792
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2010-8-18
收藏
得分:0 
的确,因为刚学C++,很多不会
2011-03-31 19:55
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:5 
最好先调试一下
2011-04-02 07:55
快速回复:new 的使用,能运行但不知为何会弹出Dug Assertion Failed!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021086 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved