保持我的char在范围内,并处理它

时间:2012-05-28 18:13:17

标签: c++ pointers memory-management

我有一个函数将相对路径(例如“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甚至没有。我感谢这里的任何帮助,因为我不知所措......

1 个答案:

答案 0 :(得分:3)

您有三种选择:

1)确定string_t将始终拥有它指向的字符串,并且它将负责解除分配它。让构造函数分配/复制。

2)确定string_t永远不会拥有它指向的字符串,并且代码调用它将始终负责在必要时解除分配。

3)确定string_t将支持这两个模型,并且需要一个标志来决定是否在其析构函数中调用free[]。调用代码必须告诉string_t是否要分配/复制或是否只是隐藏指针。

请务必遵循rule of three。或者更好的是,只需使用std::string,它始终采用选项1,因此您可以毫不费力地使用它。