我正在创建一个我创建的类,它有一个addClass函数,允许用户将A Instance of Class添加到一个动态分配的数组中。
以下是该类的代码和一个简单的测试:
Class.h列表
#ifndef CLASS_H
#define CLASS_H
#include<iostream>
class Class {
public:
Class(std::string text);
Class(const Class& orig);
virtual ~Class();
Class(std::string text, Class * name, int size);
std::string toString();
void addClass(Class * name, int size = 1);
Class getClass(int index);
private:
Class * classArray;
std::string value;
int size;
};
#endif /* CLASS_H */
Class.c列表
#include "Class.h"
#include <cstdlib>
Class::Class(std::string text) {
classArray = NULL;
value = text;
size = 0;
}
Class::Class(const Class& orig) {/*...*/}
Class::~Class() {}
Class::Class(std::string text, Class * name, int size){
value = text;
this->size = size;
if(size == 1)
classArray = name;
else{
int i;
classArray = (Class*)malloc(size*sizeof(Class));
for(i = 0; i < size; i++){
classArray[i] = name[i];
}
}
}
std::string Class::toString(){
return value;
}
void Class::addClass(Class * name, int size){
int i;
Class * tmp = (Class*)malloc((this->size+size)*sizeof(Class));
for(i = 0; i < this->size-1; i++){
tmp[i] = classArray[i];
}
if(size == 1)
tmp[size-1] = name[0];//assignement method is the problem!!!??
else{
for(i = this->size; i < this->size+size-1; i++){
tmp[i] = name[i];
}
}
this->size += size;
free(classArray);
classArray = tmp;
}
Class Class::getClass(int index){
return classArray[index];
}
test.c列表
#include<iostream>
#include "Class.h"
using namespace std;
int main(int argc, char** argv) {
Class * objectA = new Class("objectA");
Class * objectB = new Class("objectB");
cout << objectA->toString() << endl;
objectA->addClass(objectB);
//never gets here :'(
cout << objectA->toString() << endl;
return 0;
}
问题是测试永远不会超过objectA-&gt; addClass(objectB)指令。我试图调试,我发现问题来自addClass()方法的assignement指令。我也试过memcpy它没用。有没有人有这方面的解决方案。感谢。
答案 0 :(得分:3)
不要在C ++对象上使用malloc,使用new和new []以及删除和删除[]。 C ++中malloc的问题在于它不会为您的对象调用构造函数,而free则不会调用析构函数。 new,new [],delete和delete [] do。你得到了一个崩溃,因为你正在分配给未构造的对象而你得到了这个,因为你没有使用新的。
不是说这是你的代码唯一的问题,但它是显而易见的。
答案 1 :(得分:2)
基本解决方案是new
和delete
优先于malloc
和free
。更好的解决方案是使用标准容器(例如std::vector
)将元素保存在Class::addClass()
。让计算机负责所有内存管理;你将节省大量的开发和调试时间。
答案 2 :(得分:1)
请注意,在您的代码中,您为类定义了自定义复制构造函数Class(const Class&)
,但您似乎不已定义复制赋值运算符 {{1 }}。请注意,在您的代码中,您使用副本分配(Class& operator=(const Class&)
)来创建类的副本,但是您没有正确实现它。
此外,在C ++中,您应该更喜欢将operator=
/ new[]
用于C delete[]
/ malloc()
,更好的方法是使用 free()
< / strong>数组容器。
您还可以拥有std::vector
(例如std::vector< SomeSmartPointer >
或std::vector<std::shared_ptr<SomeClass>>
)。通常,请考虑某些智能指针的std::vector<std::unique_ptr<SomeClass>>
,但不要使用拥有原始指针的std::vector
(std::vector
)