【问题标题】:Delete pointer to vector of char* in destructor (Not working)在析构函数中删除指向 char* 向量的指针(不工作)
【发布时间】:2012-07-02 19:18:54
【问题描述】:

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

标题:

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

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

【问题讨论】:

  • 如何将数据放入向量中?看起来那些char*s 不是使用new 分配的。
  • 您是在第一个变体的构造函数中创建一个带有“新向量”的向量,并使用有效数据或空指针对其进行初始化吗?
  • 虽然我有 vector 向量,但我从未在其上调用构造函数并存储了值,尝试通过以下方式为 pVector 执行此操作:vector vector = new vector( ); pVector = &vector;虽然不工作..
  • @Deukalion:你能发布一些来自你的编辑的编译吗?
  • 这有效:vector vector1;向量 * pVector = &vector1;但是当我尝试将相同的东西分配给我在类中的类中的指针时,私有块它给了我一个错误。

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


【解决方案1】:

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

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

您似乎应该使用std::vector&lt;std::string&gt;

更新问题:

标题:

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

【讨论】:

  • 我之前有一个向量<:string>,将其更改为char* 以使内存分配更小。但是在我的课堂上,私有块中我有几个vector 或vector,我从来不需要调用“new vector()”才能在向量上使用push_back()。那我该怎么做呢?
  • @Deukalion:对不起,我不明白你的问题。你应该怎么做?
  • 我的意思是我以前从来不需要在向量上调用 new 来分配它的大小或任何东西。必须以某种方式获得指向指针向量的指针并将其删除。这几乎就是我想要的,我的理解是错误的。
  • @Deukalion:如果你想要一个指向指针向量的指针,并且如果你想删除这些指针,那么除了 i*i 之外,你的析构函数代码是正确的。您收到错误的事实是由于您在未显示的代码中放入向量中的内容存在问题。
  • 我刚刚编辑了我的帖子并将几乎所有的代码都放在了帖子中,所以告诉我我忘了把新的放在哪里。
【解决方案2】:

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

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

【讨论】:

  • 或用new char[some_size];分配的数组
  • ...但我需要它来存储动态数据。不是固定大小的数组。
  • @Deukalion:你需要读一本 C++ 的书,靠猜测是不可能写出正确的 C++ 代码的。这在某些语言中可能是可能的,但 C++ 不是其中之一。 deletenew 一起使用,delete[]new[] 一起使用。
  • 我对编程并不陌生,只是不熟悉指针以及如何管理和删除它们。我只是没有太多地使用它们。由于这有效,但它在类范围内不起作用,我不知道出了什么问题:vector vector1;向量 * pVector = &vector1; pVector->push_back(StringToCharPointer("test"));
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您似乎应该使用std::vector&lt;std::string&gt; 来缩短Steve Jessop 的明智词。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2020-06-24
      • 2015-08-09
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2018-04-05
      • 2014-12-30
      相关资源
      最近更新 更多