我有一个函数将相对路径(例如“log \ crash.txt”)转换为完整路径(例如“E:\ Program \ log \ crash.txt”)。功能是:
string_t GetAbsPath(string_t relPath)
{
char abs[1024];
//Get the working directory
GetCurrentDirectory(1024, abs);
#pragma warning(disable:4996)
//Add a slash and content folder
memcpy(&abs, strcat(abs, "\\content\\"), 1024);
//Append it to the relative path
memcpy(&abs, strcat(abs, relPath.c_str()), 1024);
#pragma warning(default:4996)
return abs;
}
string_t
是我写的一个类,它基本上是const char*
的包装器。我的问题是,(我有点预料到......)是当函数返回时,abs
超出范围,获得返回值的string_t
现在为空/垃圾。在这种情况下,我通常会使用memcpy
将其复制到一个不会超出范围的指针中。但问题是,指针(const char*
中的string_t
)需要delete[]
'd。 string_t
没有开头的析构函数。我可以在那里写一个delete[]
,但这又有另一个问题:
如果我像这样创建string_t
:
string_t crash = "New[] isn't called! Ahh!";
当我在析构函数中转到delete[]
时,程序将崩溃,因为从未调用new []。
我可以delete[]
调用const char*
的函数中的GetAbsPath
,如下所示:
void LoadModel(string_t relPath)
{
string_t fullPath = GetAbsPath(relPath);
. . .
delete[] fullPath.c_str();
}
但是我知道如果我稍后回到代码中,我会像“为什么delete[]
在那里”,或者我会在不需要的时候添加它......以及指针是,那里有很多错误的余地。
我可以做些什么来保持范围内的char(我猜这只能用指针完成),并确保分配的内存得到清理?必须有一种方法,因为std :: string保持一切干净,并且它具有连接等功能,而string_t
甚至没有。我感谢这里的任何帮助,因为我不知所措......
答案 0 :(得分:3)
您有三种选择:
1)确定string_t
将始终拥有它指向的字符串,并且它将负责解除分配它。让构造函数分配/复制。
2)确定string_t
永远不会拥有它指向的字符串,并且代码调用它将始终负责在必要时解除分配。
3)确定string_t
将支持这两个模型,并且需要一个标志来决定是否在其析构函数中调用free[]
。调用代码必须告诉string_t
是否要分配/复制或是否只是隐藏指针。
请务必遵循rule of three。或者更好的是,只需使用std::string
,它始终采用选项1,因此您可以毫不费力地使用它。