- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个简单的类 Person,它继承自抽象类 Object。我正处于学习深拷贝的部分,但我似乎无法让这段简单的代码工作:
Person.h
#include <iostream>
#include <cstring>
#ifndef _PERSON_H_
#define _PERSON_H_
using namespace std;
class Object {
protected:
//This pure virtual func. sends appropriate ostream
//to operator<<'s override. Must be implemented in each
//derived class accordingly.
virtual void print(std::ostream&) const =0;
public:
//Override ostream operator.
friend ostream& operator<<(ostream& os, const Object& obj);
friend ostream& operator<<(ostream& os, const Object* obj);
virtual ~Object();
};
class Person : public Object {
private:
char* m_name;
virtual void print(std::ostream& os) const;
Person(); //What's your default name?
public:
Person(char* name);
Person(const Person& p);
Person& operator=(const Person &rhs);
virtual ~Person();
};
#endif // _PERSON_H_
Person.cpp
#include "Person.h"
ostream& operator<<(ostream& os, const Object& obj) {
obj.print(os);
return os;
}
ostream& operator<<(ostream& os, const Object* obj) {
obj->print(os);
return os;
}
Object::~Object() { };
//Standard ctor
Person::Person(char* name) {
m_name = new char[strlen(name)];
strncpy(m_name, name, strlen(name));
}
//Copy ctor
Person::Person(const Person& p) {
m_name = new char[strlen(p.m_name)];
strncpy(m_name, p.m_name, strlen(p.m_name));
}
//dtor
Person::~Person() {
delete [] m_name;
}
//operator= overload
Person& Person::operator=(const Person &rhs) {
if (this == &rhs) return * this; //Self copy check.
delete [] m_name;
m_name = new char[strlen(rhs.m_name)];
strncpy(m_name, rhs.m_name, strlen(rhs.m_name));
return * this;
}
//private
void Person::print(std::ostream& os) const{
os << m_name;
}
int main() {
//Person p1("Anis");
//Person p2("Bassam");
Person * p1 = new Person("Anis");
Person * p2 = new Person("Bassam");
p1 = p2;
delete p1;
delete p2;
return 0;
}
输出:
a.out(4839,0x7fff7420b300) malloc: *** error for object 0x7f914b404ad0: pointer being freed was not allocated
gdb BT:
#0 0x00007fff8d7b2282 in __pthread_kill ()
#1 0x00007fff8b5fd4c3 in pthread_kill ()
#2 0x00007fff8e528b73 in abort ()
#3 0x00007fff83739937 in free ()
#4 0x0000000100000b51 in Person::~Person (this=0x1001048e0) at Person.cc:29
#5 0x0000000100000b85 in Person::~Person (this=0x1001048e0) at Person.cc:28
#6 0x0000000100000ba8 in Person::~Person (this=0x1001048e0) at Person.cc:28
#7 0x0000000100000e46 in main () at Person.cc:54
程序在 delete p2; 时崩溃,根据 gdb。在书中他们就这种情况警告了我们,所以我遵循了他们提供的修复方法,即重载 operator= 并确保有复制构造函数。我错过了什么?提前致谢。
附注我目前只对深层复制问题感兴趣。模板和泛型将在后面的章节中介绍。
最佳答案
在p1=p2
之后,两个变量都指向同一个对象。 delete p1
删除这个对象。所以 delete p2
再次尝试删除这个对象。
Operator= 在这里帮不了您,因为您分配的是指针,而不是对象。可能您需要 *p1 = *p2
。
关于c++ - 基本深拷贝(操作重载),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28246601/
拿这个: var lists:{ item1:{} ,item2:{} ,item3:{} ,item4:{} } 由于它基本上是空的,我想要一个函数(可能但不一定是 _lodash
我想更改 ng bootstrap 分页组件的样式并在 Angular 6 应用程序中使用 /deep/ 链接。以下代码工作正常,但控制台显示警告,指出该代码已被弃用。 那么,我应该如何更改它以消除警
使用 webcomponents,您可以使用 /deep/ 定位 shadowdom 的内部元素,在我尝试使用事件委托(delegate)之前它工作正常。 一个常规的点击功能将起作用: $('html
在 Swift 中,我试图实现一个单词 Trie,使用文字表示作为一系列嵌套的 NSObject。这是 Trie。 let GEENITRIE:NSObject = [ "i":[
运行 npm update 更新 package.json 中列出的项目;但是,这些项目的依赖关系仍然过时。 明显的解决方法是再次运行 npm update。有时我需要运行它 3 次以上才能使 npm
我创建了 2 级嵌套 linq 查询: var data = (from p in Departments join e in Employees on p.Id equals
首先是代码 #include typedef wchar_t* BSTR; wchar_t hello[] = L"Hello"; class _bstr_t { public: opera
我要编写一个 lisp 程序来生成十六进制数的实际值。我已经编写了一个函数,但似乎出现了 stackoverflow(深度)错误。我想知道是否有人可以指出我的错误或指导我朝着正确的方向前进。 如果没有
我想将每种类型都转换为boolean 或object type CastDeep = { [P in keyof T]: K extends K[] ? K[] : T[P] ex
我刚刚发现自己在写这个: fn init_timestamps(dir: &PathBuf, file_timestamps: &'static HashMap) { match fs::re
我有一个现有的 pybind11::array_t,需要进行复制构造。 pybind11 中是否有一个函数允许我对 array_t 进行深度复制? 我知道我可以创建一个新的 array_t,适当调整大
引用http://www.devx.com/tips/Tip/13291 ,它说我可以使用 memcpy 来复制由 sizeof() 确定的大小,但是,数组不是指向指针吗? 除了遍历数组,如何使用 m
我有多个成员(member),每个成员(member)都有一条记录,其中包含几个备注字段: Member ID Entry A Entry B 1 [memo t
$watchCollection 是否能够忽略对以 $ 开头的属性的更改?使用深度 $watch 时已经存在此行为,因为它依赖于 angular.equals 进行比较。 理想情况下,$watchCo
我有一个带有复杂键的 map - 例如,二维数组: m := make(map[[2][3]int]int) 当我在映射中插入一个新键时,Go 是否会对该键进行深度复制? a := [2][3]int
我需要查询如下所述的三个表。我了解简单的 JOIN,但是这个有点超出我的水平。 courses 有两列 id (PK) 和 courseTitle(示例 id 1,courseTitle 物理) cl
我有一个对象,它是 Realm 的 Object 子类,并且符合 Codable 以便在与 API 对话时与 JSON 相互转换。 如何利用 Codable 协议(protocol)进行深度复制(包括
我是一名优秀的程序员,十分优秀!