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
的东西。你之所以会出错,是因为在你不知道的代码中,你在向量中输入的东西有问题我刚刚编辑了我的帖子,把几乎所有的代码都放在了帖子里,所以告诉我我忘了把新的放在哪里了。