为什么删除TStringList指针会抛出异常?

时间:2016-07-27 19:58:34

标签: c++ pointers c++builder tstringlist

我正在使用Embarcadero C ++ Builder。

我有一个声明the的函数,在整个函数中使用它,然后TStringList是函数末尾的对象。

我一直在愉快地使用这个代码作为32位应用程序并将其转换为64位应用程序,现在我在尝试删除delete时遇到“无效指针操作”异常。有什么想法吗?

奇怪的是,我遇到了另一个使用字符指针(使用TStringList创建堆内存空间)和new操作的函数。我最终为该函数创建了一个具有堆栈空间的本地缓冲区,但是由于我想使用delete对象,我一直坚持这个。

以下是代码:

TStringList

1 个答案:

答案 0 :(得分:3)

正如评论中所述,您的代码中存在逻辑错误,导致您delete List两次,或者完全泄漏。

尝试更像这样的东西:

String ReadUserConfig(String ConfigString) {
    String UserConfigPath = AppDrive + "\\DC\\userconfig.csv";

    try {
        TStringList *List = new TStringList;
        try {
            if (FileExists(UserConfigPath)) { // file present, parse it
                List->LoadFromFile(UserConfigPath);

                for (int i = 0; i < List->Count; ++i) {
                    String thisLine = List->Strings[i];

                    /* search for ConfigString in this line */
                    if ((thisLine.Pos(ConfigString) != 0) &&
                        (thisLine.Pos("USER_CONFIG") != 0)) {
                        /* grab everything right of ConfigString */
                        thisLine = thisLine.SubString(thisLine.Pos(ConfigString) + ConfigString.Length() + 1, thisLine.Length());
                        ReturnString = thisLine.Trim();    
                        break;
                    }
                }
            }
        }
        __finally {
            delete List;
        }
    }
    catch(const Exception &e) {
        ShowMessage("Exception in ReadUserConfig()\n" + e.Message);
    }
    catch(...) {
        ShowMessage("Exception in ReadUserConfig()");
    }

    return ReturnString;
}

或者,使用std::auto_ptr(预C ++ 11)或std::unique_ptr(C ++ 11及更高版本)而不是try/finally块:

#include <memory>

String ReadUserConfig(String ConfigString) {
    String UserConfigPath = AppDrive + "\\DC\\userconfig.csv";

    try {
        //std::auto_ptr<TStringList> List(new TStringList);
        std::unique_ptr<TStringList> List(new TStringList);

        if (FileExists(UserConfigPath)) { // file present, parse it
            List->LoadFromFile(UserConfigPath);

            for (int i = 0; i < List->Count; ++i) {
                String thisLine = List->Strings[i];

                /* search for ConfigString in this line */
                if ((thisLine.Pos(ConfigString) != 0) &&
                    (thisLine.Pos("USER_CONFIG") != 0)) {
                    /* grab everything right of ConfigString */
                    thisLine = thisLine.SubString(thisLine.Pos(ConfigString) + ConfigString.Length() + 1, thisLine.Length());
                    ReturnString = thisLine.Trim();    
                    break;
                }
            }
        }
    }
    catch(const Exception &e) {
        ShowMessage("Exception in ReadUserConfig()\n" + e.Message);
    }
    catch(...) {
        ShowMessage("Exception in ReadUserConfig()");
    }

    return ReturnString;
}