gpt4 book ai didi

c++ - 表达式 : _CrtlsValidHeapPointer(pUserData) error

转载 作者:行者123 更新时间:2023-11-28 02:53:03 26 4
gpt4 key购买 nike

我正在尝试了解 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) error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22620790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com