c ++程序成功构建,无输出,只显示堆栈跟踪

时间:2011-08-14 00:35:18

标签: c++ oop memory-management iostream

成功构建,但Netbeans运行输出堆栈跟踪

堆栈追踪:

Frame     Function  Args
0022C694  7570EFA3  (00000108, 0000EA60, 00000000, 0022C7B8)
..............
End of stack trace

我正逐行阅读一个文件,并检查它们是否有使用C ++类概念的元音。

我已经测试过逐行读取文件,并且在不使用C ++类的情况下逐行成功编写文件。

请指出我应该更改代码的位置。我猜存在内存管理问题。

非常感谢!

#include <cstdlib>
#include<fstream>
#include <iostream>

using namespace std;

class Password{
    private:
         char *pwd;
    public:
        Password(const char*pwd){
            setPassword(pwd);
        }
        ~Password(){
            delete []pwd;
        }
        void setPassword(const char *pwd){
            delete []this->pwd;
            if(pwd!=NULL){
                this->pwd=new char[strlen(pwd)+1];
                strcpy(this->pwd,pwd);
            }else{
                 this->pwd=NULL;
                }
        }
        char *getPassword(){
            return this->pwd;
        }
        bool containsVowel(){
            int i,counter=0;
            for(i=0;i<strlen(this->pwd);i++){
            if(this->pwd[i]== 'a' || 'e' || 'i' || 'o' || 'u' )
                counter++;
             }
            if (counter>0)
                return true;
            return false;
      }
};

int main(int argc, char** argv) {
    ifstream infile("C:/Users/user/Desktop/say.in"); 
    ofstream outfile("C:/Users/user/Desktop/say.out");
    string str; 
    while (getline(infile,str)){
       const char *pwd=str.c_str();
       Password pwdObj(pwd);
       if (pwdObj.containsVowel()==true){
    outfile<<"<"<<str<<"> is accpetable\r\n";
    }

    }
    infile.close();
    outfile.close();
    return 0;
}

3 个答案:

答案 0 :(得分:3)

有几件事。第一个是pwd的{​​{1}}成员未初始化,这可能会导致Password在第一次调用时失败。您可以像这样在构造函数中初始化(重命名参数以避免混淆):

setPassword(...)

第二个问题是 Password(const char *apwd) : pwd(0) { setPassword(apwd); } 在你发布它时已经完全破碎了。变量containsVowel也没有初始化,我猜测应该有一个循环---看起来它已被省略了。此外,Delan在回复中也提到了比较问题。

您还可以考虑将i成员设为std::string。无论是在内存管理方面还是在寻找元音方面,它都会让你的生活变得更加轻松 - 我想你可以使用str.find_first_of(...)找到元音而不用自己迭代所有的字符。

答案 1 :(得分:1)

if(this->pwd[i]== 'a' || 'e' || 'i' || 'o' || 'u' )

应该是

if(this->pwd[i]== 'a' || this->pwd[i]== 'e' || this->pwd[i]== 'i' || this->pwd[i]== 'o' || this->pwd[i]== 'u' )

答案 2 :(得分:0)

如果你这样做:

        delete []this->pwd;
        if(pwd!=NULL){
            this->pwd=new char[strlen(pwd)+1];

如果this-&gt; pwd为NULL,会发生什么?