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

C++ 在析构函数中删除指向char*向量的指针(不工作),c++,pointers,vector,destructor,delete-operator,C++,Pointers,Vector,Destructor,Delete Operator,我有一个包含一些向量的类,我不确定哪个方法是最好的,但是当我调用析构函数时,它们应该从内存中删除 标题: class Test { public: Test(); ~Test(); void AddString(char* text); void AddString(string text); private: char * StringToCharPointer(string value); vector<char*> *pVe

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

标题:

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

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

private:
    char * StringToCharPointer(string value);

    vector<char*> *pVector;
}
class Test
{
public:
    Test();
    ~Test();

    void AddString(const string &text);
private:
    vector<string> mVector;
};
类测试
{
公众:
Test();
~Test();
void AddString(字符*文本);
void AddString(字符串文本);
私人:
字符*StringToCharPointer(字符串值);
向量*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));
};
Test::Test()
{
};
测试::~Test()
{
向量::迭代器i;
对于(i=pVector->begin();iend();i++)
{
删除*i;
}
删除pVector;
};
字符*测试::StringToCharPointer(字符串值)
{
char*pChar=新字符[value.length()];
strcpy(pChar,value.c_str());
返回pChar;
};
测试::AddString(字符*文本)
{
pVector->push_back(文本);
};
测试::AddString(字符串文本)
{
pVector->push_back(StringToCharPointer(文本));
};

这里是我使用的几乎所有的方法,但有什么不对吗?

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

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


似乎应该使用
std::vector

更新问题的更新:

标题:

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

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

private:
    char * StringToCharPointer(string value);

    vector<char*> *pVector;
}
class Test
{
public:
    Test();
    ~Test();

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

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


但是,您收到的错误表明您在向量中放入了不好的内容。只有
字符*
可以插入到具有此类销毁代码的向量中,才是
新字符
返回的字符。特别是,您不能插入文字(
“abc”
)或作为其他字符串的一部分(
strok)的字符串这是一个明显的问题:
char*pChar=new char[value.length()];
。您正在执行
new[]
但在调用未定义行为的析构函数中执行
delete
。您应该使用
delete[]
删除这些指针。但是使用
delete[]
可能会给
Test::AddString(char*text)
方法带来问题,因为您无法确定
text
的内存分配方式,即使用
new
new[]
malloc
。最简单的方法是按照Steve Jossep的建议使用
std::vector

似乎应该使用
std::vector
,以缩短


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

如何将数据放入向量?看起来那些
char*
s不是使用
new
分配的。是否使用“new vector”创建向量在第一个变量的构造函数中,并使用有效数据或空指针初始化它?虽然我有vector vector,但我从未对它调用过构造函数,它存储了值,但尝试通过:vector vector=new vector()为pVector执行此操作;pVector=&vector;不起作用。@Deukalion:你能发布一些来自编辑器的可编译文件吗?这是可行的:vector vector1;vector*pVector=&vector1;但是当我尝试将相同的内容分配给类中的指针时,private block会给我一个错误。或者分配了
new char[some\u size]的数组“我需要它来存储动态数据。不是固定大小的数组。”Dukalion:你需要读一本C++书,猜不到写正确的C++代码。这可能是在某些语言中,但是C++不是其中之一。<代码>删除<代码>与<代码>新< /代码>,和<代码>删除[]/Cord> > <代码>新[]。
。我对编程并不陌生,只是不熟悉指针以及如何管理和删除它们。我只是没有太多地使用它们。由于这是可行的,但在类范围内不起作用,我不知道出了什么问题:vector vector1;vector*pVector=&vector1;pVector->push_back(StringToCharPointer(“测试”));我之前有一个向量,将它改为char*以减小内存分配。但是在我的类private block中,我有两个向量或向量,在使用push_back()之前,我从未调用过“new vector()”关于向量。那我该怎么做呢?@Deukalion:对不起,我不明白你的问题。你该怎么做?我的意思是,我以前从来没有在向量上调用new来分配它的大小或任何东西。必须有某种方法让指针指向向量并删除它。我的理解是,这正是我想要的怎么做是错误的。@Deukalion:如果你想要一个指向指针向量的指针,如果你想删除这些指针,那么你的析构函数代码是正确的,而不是
i
vs
*i
的东西。你之所以会出错,是因为在你不知道的代码中,你在向量中输入的东西有问题我刚刚编辑了我的帖子,把几乎所有的代码都放在了帖子里,所以告诉我我忘了把新的放在哪里了。