_CrtlIsValidHeapPointer 销毁期间出错
_CrtlIsValidHeapPointer error during destruction
我在解构显示对象 t_display
时遇到 _CrtlIsValidHeapPointer(block)
错误。这发生在 Animation.cpp 中用于获取用户输入和进行多次显示的 while 循环之后。
我知道这是因为我为 char * p_name
分配了内存,并将该指针存储在对象中,但我不确定如何绕过它。我必须使用 char * 作为显示对象名称,所以这一定意味着我必须为其分配内存。
我认为可能存在两个问题之一。
1) 我为 char * 分配了错误的内存,或者错误地复制了字符串
2) 我写错了析构函数
在这两种情况下,我都不确定如何解决我遇到的这个错误,希望您能为我指出正确的方向。
Animation.cpp
#include <crtdbg.h>
#include <iostream>
#include <string>
#include <vector>
#include <forward_list>
using namespace std;
#include "Display.h"
#include "Frame.h"
#include "Animation.h"
void Animation::InsertFrame() {
int numDisplays; //for user input of display number
vector <Display>v; //vector for containing display objects
int p_x; //will contain user input for pixel_x
int p_y; //will contain user input for pixel_y
int p_duration; //will contain user input for duration
char * p_name; //temp string to contain user input for name
//will contain p_name to be passed to display constructor
string frameName; //contains user input for the frame name
int q = 0; //used to count the diplay #
//begin reading user input
cout << "Insert a Frame in the Animation\nPlease enter the Frame filename: " ;
cin >> frameName;
cout << "Entering the Frame Displays (the sets of dimensions and durations) " << endl;
cout << "Please enter the number of Displays: " ;
cin >> numDisplays;
string d_name;
//display creation loop for # of displays entered
while (numDisplays > 0) {
//char * name=nullptr;
cout << "Please enter pixel x for Display #"<<q<<" pixel_x:";
cin >> p_x;
cout << "Please enter pixel y for Display #"<<q<<" pixel_y:" ;
cin >> p_y;
cout << "Please enter the duration sec for this Display: " ;
cin >> p_duration;
cout << "Please enter the name for this Display: " ;
//cin >> p_name;
cin >> d_name;
//p_name = new char[strlen(name)];
p_name = new char[d_name.length() + 1]; //allocate for the size of the name entered
strcpy(p_name, d_name.c_str()); //copy string to char []
Display t_display = Display(p_x, p_y, p_duration, p_name); //make a new display with the user input values
v.push_back(t_display); //pushing onto the vector
numDisplays--;
q++;
}
Display.h
// Display.h
#pragma once
class Display
{
int pixel_x;
int pixel_y;
int duration;
char* name;
public:
Display(int x, int y, int duration, char* name);
Display(const Display&);
~Display();
friend ostream& operator<<(ostream&, Display&);
};
Display.cpp
#include <crtdbg.h>
#include <iostream>
#include <string>
#include <vector>
#include <forward_list>
using namespace std;
#include "Display.h"
Display::Display(int x, int y, int d, char* n):pixel_x(x), pixel_y(y), duration(d), name(n) {
}
Display::Display(const Display& p) {
//copy values from p
pixel_x = p.pixel_x;
pixel_y = p.pixel_y;
duration = p.duration;
name = p.name;
}
Display::~Display() {
}
该程序可以在没有析构函数的情况下运行,但当然会有内存泄漏,这是不可接受的。当我添加一个简单的析构函数时,例如 :
if(name){
delete[] name;
}
它将抛出该错误。
在你的复制函数中,你将 name 的值赋给了新对象,因此 dtor 将 运行 用于原始对象和复制的对象,但每个对象都会尝试释放指针。
在你的构造函数中分配一个新缓冲区并复制内容。更好的方法是简单地使用 std::string 作为 Display 成员,那么您唯一需要关心的缓冲区就是用于查询 OS.
的缓冲区
我在解构显示对象 t_display
时遇到 _CrtlIsValidHeapPointer(block)
错误。这发生在 Animation.cpp 中用于获取用户输入和进行多次显示的 while 循环之后。
我知道这是因为我为 char * p_name
分配了内存,并将该指针存储在对象中,但我不确定如何绕过它。我必须使用 char * 作为显示对象名称,所以这一定意味着我必须为其分配内存。
我认为可能存在两个问题之一。 1) 我为 char * 分配了错误的内存,或者错误地复制了字符串 2) 我写错了析构函数
在这两种情况下,我都不确定如何解决我遇到的这个错误,希望您能为我指出正确的方向。
Animation.cpp
#include <crtdbg.h>
#include <iostream>
#include <string>
#include <vector>
#include <forward_list>
using namespace std;
#include "Display.h"
#include "Frame.h"
#include "Animation.h"
void Animation::InsertFrame() {
int numDisplays; //for user input of display number
vector <Display>v; //vector for containing display objects
int p_x; //will contain user input for pixel_x
int p_y; //will contain user input for pixel_y
int p_duration; //will contain user input for duration
char * p_name; //temp string to contain user input for name
//will contain p_name to be passed to display constructor
string frameName; //contains user input for the frame name
int q = 0; //used to count the diplay #
//begin reading user input
cout << "Insert a Frame in the Animation\nPlease enter the Frame filename: " ;
cin >> frameName;
cout << "Entering the Frame Displays (the sets of dimensions and durations) " << endl;
cout << "Please enter the number of Displays: " ;
cin >> numDisplays;
string d_name;
//display creation loop for # of displays entered
while (numDisplays > 0) {
//char * name=nullptr;
cout << "Please enter pixel x for Display #"<<q<<" pixel_x:";
cin >> p_x;
cout << "Please enter pixel y for Display #"<<q<<" pixel_y:" ;
cin >> p_y;
cout << "Please enter the duration sec for this Display: " ;
cin >> p_duration;
cout << "Please enter the name for this Display: " ;
//cin >> p_name;
cin >> d_name;
//p_name = new char[strlen(name)];
p_name = new char[d_name.length() + 1]; //allocate for the size of the name entered
strcpy(p_name, d_name.c_str()); //copy string to char []
Display t_display = Display(p_x, p_y, p_duration, p_name); //make a new display with the user input values
v.push_back(t_display); //pushing onto the vector
numDisplays--;
q++;
}
Display.h
// Display.h
#pragma once
class Display
{
int pixel_x;
int pixel_y;
int duration;
char* name;
public:
Display(int x, int y, int duration, char* name);
Display(const Display&);
~Display();
friend ostream& operator<<(ostream&, Display&);
};
Display.cpp
#include <crtdbg.h>
#include <iostream>
#include <string>
#include <vector>
#include <forward_list>
using namespace std;
#include "Display.h"
Display::Display(int x, int y, int d, char* n):pixel_x(x), pixel_y(y), duration(d), name(n) {
}
Display::Display(const Display& p) {
//copy values from p
pixel_x = p.pixel_x;
pixel_y = p.pixel_y;
duration = p.duration;
name = p.name;
}
Display::~Display() {
}
该程序可以在没有析构函数的情况下运行,但当然会有内存泄漏,这是不可接受的。当我添加一个简单的析构函数时,例如 :
if(name){
delete[] name;
}
它将抛出该错误。
在你的复制函数中,你将 name 的值赋给了新对象,因此 dtor 将 运行 用于原始对象和复制的对象,但每个对象都会尝试释放指针。
在你的构造函数中分配一个新缓冲区并复制内容。更好的方法是简单地使用 std::string 作为 Display 成员,那么您唯一需要关心的缓冲区就是用于查询 OS.
的缓冲区