我正在尝试学习C ++中的指针和一流对象。我确定问题在我的指针分配或调用中。我想知道是否有人可以帮助我更好地理解指针以及使用静态变量/方法。
FirstClass.h
#pragma once
class FirstClassObject {
public: FirstClassObject();
FirstClassObject(int);
FirstClassObject(int, FirstClassObject);
static void next_attr();
static int attribute;
int num;
FirstClassObject *buffer;
FirstClassObject *next;
~FirstClassObject();
};
FirstClassObject.cpp
#include "FirstClass.h"
#include <stdlib.h>
#include <string>
using namespace std;
FirstClassObject::FirstClassObject(){
num = attribute;
next_attr();
};
FirstClassObject::FirstClassObject(int attr){
num = attr;
next_attr();
}
FirstClassObject::FirstClassObject(int attr, FirstClassObject object){
num = attr;
next_attr();
buffer = (FirstClassObject*) malloc(5);
memcpy(buffer,&object,1);
next = buffer;
}
void FirstClassObject::next_attr(){
attribute++;
}
FirstClassObject::~FirstClassObject(){
free(buffer);
free(next);
}
FirstClassObject_test.cpp
#include "FirstClass.h"
#include <iostream>
using namespace std;
int FirstClassObject::attribute = 0;
FirstClassObject get_next_object(FirstClassObject object){
FirstClassObject next_object;
next_object.buffer = object.next;
return next_object;
}
int main(){
FirstClassObject object;
FirstClassObject otherobject(4, object);
cout << get_next_object(otherobject).num << "these numbers should be the same " << object.num << '\n';
return 0;
}
提前致谢。
最佳答案
首先,这是错误的:
buffer = (FirstClassObject*) malloc(5);
memcpy(buffer,&object,1);
malloc()与new []不同。
您的FirstClassObject类型是非POD类型,因为它具有非平凡的析构函数。这意味着您不能使用malloc()正确构造它。 malloc()所做的只是分配内存,仅此而已。您实际上需要构造一个FirstClassObject对象,并使用
new[ ]
动态地进行操作。其次,malloc()需要分配的字节数。什么是sizeof(FirstClassObject)?我敢打赌它不是5(您给malloc()的参数)。但是要点是,即使给了malloc()正确的字节数,也无法通过使用它正确地构造对象。
第三,由于FirstClassObject不是POD,因此memcpy()的用法也不好。简而言之,memcpy()不会复制对象。要复制对象,请调用复制构造函数。
您似乎正在阅读C语言书籍和/或阅读C语言资源,而不是C ++书籍和资源。如果您愿意,请放下C语言,然后从适当的来源学习C ++。如果您尝试将C与C ++混合使用(没有适当的经验),则会遇到诸如示例之类的问题。
关于c++ - 表达式:_CrtlsValidHeapPointer(pUserData)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22620790/