我试图在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;
}
提前致谢。
答案 0 :(得分:1)
首先:
buffer = (FirstClassObject*) malloc(5)
这会分配一个大小为5的缓冲区,而不是5个FirstClassObject。为此,您需要执行以下操作:
buffer = (FirstClassObject*) malloc(5*sizeof(FirstClassObject));
第二
memcpy(buffer,&object,1);
这只复制了对象结构中的1个字节。不是一个完整的对象。在这里,sizeof也是你的朋友,虽然它很危险,因为接收缓冲区不是一个完全构造的对象。
然后这一行:
next_object.buffer = object.next;
会成员到成员副本(提供它,因为你试图将对象影响到指针)有效地写入传递你先前欠分配的缓冲区的边界给你断言。
答案 1 :(得分:1)
首先,这是错误的:
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 ++混合(没有适当的经验),你最终会遇到诸如你的例子之类的问题。