为什么删除TStringList指针会引发异常
Why does deleting a TStringList pointer throw an exception?
我正在使用Embarcadero C++Builder。
我有一个函数,它声明了一个TStringList
,在整个函数中使用它,然后delete
是函数末尾的对象。
我一直很高兴地将此代码作为32位应用程序使用,并将其转换为64位应用程序,现在我在尝试删除TStringList
时遇到了"无效指针操作"异常。有什么想法吗?
奇怪的是,我在使用字符指针(使用new
创建堆内存空间)和delete
操作的另一个函数中遇到了同样的问题。我最终为该函数创建了一个具有堆栈空间的本地缓冲区,但由于我想使用TStringList
对象,所以我一直使用这个缓冲区。
这是代码:
String ReadUserConfig(String ConfigString) {
String UserConfigPath = AppDrive + "\DC\userconfig.csv";
TStringList *List = new TStringList;
if (FileExists(UserConfigPath)) { // file present, parse it
try {
List->LoadFromFile(UserConfigPath);
delete List;
}
catch(...) {
ShowMessage("Exception in ReadUserConfig()");
return ReturnString;
}
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();
i = List->Count;
}
}
}
delete List; /* CAUSES INVALID POINTER EXCEPTION */
return ReturnString;
}
如注释所述,您的代码中存在逻辑错误,导致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;
}
相关文章:
- 尝试使用智能指针时引发异常
- 获取指向派生类的指针在 C++ 中以运行时异常结束
- C++指针算术:对齐异常 (0x801)
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- free():在有效指针异常中-使用流读取巨大文件时
- 封送指向结构异常"cannot Read or Write protected memory"的指针数组的指针数组
- 将一个数组复制到函数内的另一个数组时的运行时指针异常
- dynamic_cast指针异常捕获
- 动态指针引用数组由三元运算符返回值,但有异常
- 异常未手动 - 这是空指针C++
- 启用优化时的堆栈指针比较异常
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- 异常包括字符指针和整数指针
- 智能指针和构造函数异常
- 在Linux/GCC下,将NULL指针访问转换为C++异常
- 指向矩阵的指针在 c++ 中引发异常
- 函数指针中的C 异常规范
- 在OpenCV中调用stereoRectify会导致异常:帧指针无效
- 可以通过异常指针"duplicated"异常吗?
- 为什么在抛出异常指针时要通过引用使用 catch