0

我有一个将相对路径(例如“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*in 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[]会有那个”,或者我会在不需要时添加它......而且指针是,有很多那里有错误的余地。

我能做些什么来保持这个字符在范围内(我猜这只能用指针来完成),并确保分配的内存被清理?必须有一种方法,因为 std::string 保持一切干净,并且它具有连接等功能,我string_t什至没有。我很感激这里的任何帮助,因为我不知所措......

4

1 回答 1

3

你有三个选择:

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

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

3) Decide that string_t will support both models and will need a flag to decide whether to call free[] or not in its destructor. Calling code will have to tell string_t whether to allocate/copy or whether to just stash the pointer.

Make sure to follow the rule of three. Or better yet, just use std::string which consistently takes option 1 and thus you can just use it without worrying.

于 2012-05-28T18:27:25.793 回答