在析构函数中删除指向char *向量的指针(不工作)

时间:2012-07-02 11:19:33

标签: c++ pointers vector destructor delete-operator

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

HEADER:

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 个答案:

答案 0 :(得分:7)

首先,i是向量上的迭代器,它不是存储在向量中的指针。 *i是存储在向量中的指针,因此如果您要删除任何内容,那么它应该是。

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

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

更新更新的问题:

HEADER:

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);
};

答案 1 :(得分:0)

你的破坏代码看起来很好(虽然我猜你的意思是delete *i;在第二个片段中,否则,ti甚至不会编译。

然而,你得到的错误表明你在你的载体中放了不好的东西。可以使用此类销毁代码插入到向量中的唯一char*new char返回的值。特别是,您不得将文字("abc")或作为其他字符串(strtok(NULL, ":")strchr(str, ':')的一部分的字符串插入其中。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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