我正在使用Embarcadero C ++ Builder。
我有一个声明the
的函数,在整个函数中使用它,然后TStringList
是函数末尾的对象。
我一直在愉快地使用这个代码作为32位应用程序并将其转换为64位应用程序,现在我在尝试删除delete
时遇到“无效指针操作”异常。有什么想法吗?
奇怪的是,我遇到了另一个使用字符指针(使用TStringList
创建堆内存空间)和new
操作的函数。我最终为该函数创建了一个具有堆栈空间的本地缓冲区,但是由于我想使用delete
对象,我一直坚持这个。
以下是代码:
TStringList
答案 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;
}