C++快速入门 - 36课 副本构造器 delete未初始化的指针 导致 程序出错 怎么改
vc++6.0编译器下 delete未初始化的指针(0xcccccccc) 导致 程序出错;gcc编译器 这段代码正常运行。
有什么办法可以让代码在vc++6.0编译器下正常运行,比如校验指针地址之类的方法。 你初始化为空呗? Krant5 发表于 2017-8-18 15:28
你初始化为空呗?
差不多是你这个意思,但是要 怎么改 呢? mandala 发表于 2017-8-18 21:56
差不多是你这个意思,但是要 怎么改 呢?
你要把那一块那个类的完整代码贴出来,视频里没有解决还是怎么的 本帖最后由 mandala 于 2017-8-19 15:56 编辑
Krant5 发表于 2017-8-19 08:11
你要把那一块那个类的完整代码贴出来,视频里没有解决还是怎么的
// 以下为stack.h里的代码
#ifndef STACK_H
#define STACK_H
#include <iostream>
template <typename T>
class Stack {
public:
Stack(unsigned int length = 4) {
this->length = length;
this->sp = length;
this->data = new T;
}
Stack(const Stack &stack) {
*this = stack;
}
~Stack() {
delete []data;
}
void push(T value) throw (const char *) {
if (!sp) {
throw "Stack overflow!\n";
}
data[--sp] = value;
}
T pop() throw (const char *) {
if (sp == length) {
throw"Stack out of bounds!\n";
}
return data;
}
Stack &operator=(const Stack &stack) {
if (this == &stack) {
return *this;
}
length = stack.length;
sp = stack.sp;
delete[] data; // vc++6.0编译器报错,gcc竟然能过。这里如何改?
data = new T;
for (unsigned int i = 0; i < sp; i++) {
data = stack.data;
}
return *this;
}
private:
unsigned int length;// 最大长度
unsigned int sp; // 栈指针
T *data; // 内存数据
};
#endif
// stack.h代码结束
// 以下为main.cpp的代码
#include "stack.h"
int main()
{
const unsigned short SIZE = 4;
#define type int
Stack<type> stack(4);
Stack<type> stack2 = stack; // 这里调用
int i;
try {
i = 0;
while (i < SIZE + 1) {
stack.push(i);
std::cout << "push\t" << i << std::endl;
i++;
}
} catch (const char *e) {
std::cout << e;
}
try {
i = SIZE + 100;
while (i > 0) {
type value = stack.pop();
std::cout << "pop\teax(value = " << value << ")" << std::endl;
i--;
}
} catch (const char *e) {
std::cout << e;
}
return 0;
}
// main.cpp代码结束
@小甲鱼 @人造人 @lumber2388779 @ba21 @Krant5
求帮忙解决 你的 Stack<type> stack2 = stack; 调用
Stack(const Stack &stack) {
*this = stack;
}
随后调用
Stack &operator=(const Stack &stack) {
if (this == &stack) {
return *this;
}
length = stack.length;
sp = stack.sp;
delete[] data; // vc++6.0编译器报错,gcc竟然能过。这里如何改?
data = new T;
for (unsigned int i = 0; i < sp; i++) {
data = stack.data;
}
return *this;
}
但是事实上,T * data只是被定义了而已,但是并没有初始化,这时候delete[] data;就等于对野指针指向的空间删除,原则上一定会报错的.至于解决这个问题,可以在拷贝构造函数中添加 data=0;
即为:
Stack(const Stack &stack) {
*this.data=0;
*this = stack;
} Krant5 发表于 2017-8-19 16:35
你的 Stack stack2 = stack; 调用
随后调用
你的方法很赞。想不到vc6编译器下delete的地址如果为0,直接跳过后面操作。
页:
[1]