0

我有一个包含几个向量的类,我不确定哪种方法最好,但是当我调用析构函数时,它们应该从内存中删除。

标题:

class Test
{
public:
    Test();
    ~Test();

    void AddString(char* text);
    void AddString(string text);

private:
    char * StringToCharPointer(string value);

    vector<char*> *pVector;
}

CPP 文件:

Test::Test()
{
};

Test::~Test()
{
    vector<char*>::iterator i;

    for ( i = pVector->begin() ; i < pVector->end(); i++ )
    {
        delete * i;
    }

    delete pVector;
};

char * Test::StringToCharPointer(string value)
{
    char *pChar = new char[value.length()];
    strcpy(pChar, value.c_str());

    return pChar;
};

Test::AddString(char* text)
{
    pVector->push_back(text);
};

Test::AddString(string text)
{
    pVector->push_back(StringToCharPointer(text));
};

所以这几乎是我使用的所有方法,但有什么问题?

4

4 回答 4

7

首先,i是向量上的迭代器,它不是存储在向量中的指针。*i是存储在向量中的指针,所以如果你要删除任何东西,它应该是那个。

其次,delete *i仅当 指向的对象*i被分配时才有效new。不是new[],不是 malloc,它不指向字符串文字。由于您没有说明您的数据是如何分配的,因此我们无法说明您是否正确释放它。

您似乎应该使用std::vector<std::string>.

更新更新问题:

标题:

class Test
{
public:
    Test();
    ~Test();

    void AddString(const string &text);
private:
    vector<string> mVector;
};

CPP 文件:

Test::Test()
{
};

Test::~Test()
{
};

void Test::AddString(const string &text)
{
    mVector.push_back(text);
};
于 2012-07-02T11:27:31.800 回答
0

您的销毁代码看起来不错(尽管我猜您的意思是delete *i;在第二个片段中,否则 ti 甚至都不会编译。

但是,您得到的错误表明您在向量中放入了不好的东西。唯一char*可以插入带有这种破坏代码的向量中的 s 是由new char. 特别是,您不得将文字 ( "abc") 或作为其他字符串 ( strtok(NULL, ":"),的一部分制作的字符串strchr(str, ':')插入其中。

于 2012-07-02T11:31:13.520 回答
0

您似乎应该使用std::vector<std::string>, 来缩短 Steve Jessop的明智之词。

再详细一点:你说你想“使内存分配更小”,但如果你不知道指针,听起来你走错路了,如果我猜错了过早优化,请纠正我(在这类问题中缺乏经验的开发人员通常是这种情况)。

于 2012-07-02T12:12:53.480 回答
0

这是一个明显的问题:char *pChar = new char[value.length()];. 您正在做new[]delete在调用未定义行为的析构函数中做。您应该使用delete[]删除这些指针。但是使用delete[]可能会给Test::AddString(char* text)方法带来问题,因为您无法确定如何text分配内存,即使用newornew[]malloc。最简单的方法是std::vector<std::string>按照 Steve Jossep 的建议使用。

于 2012-07-02T12:03:49.223 回答