【发布时间】:2018-01-12 20:16:55
【问题描述】:
我正在做一个项目,我必须实现 new operator 和 delete operator,并通过我自己的 MemoryManager 管理我的内存 - 它有可用内存列表。
为了分配我的列表和节点(不需要管理),我应该在调用malloc 之后显式调用operator new。
当我试图调用一个函数 - setNext() 时,它会抛出一个异常:异常:EXC_BAD_ACCESS (code=1, address=0x0)
创建链表的哈希表:
MyHashTable::MyHashTable(size_t memorySize, void* startingPtr)
:size(getLowerLog(memorySize) + 1), lists((LinkedList**)malloc(sizeof(LinkedList*) * size)), startingPtr(startingPtr) {
for (size_t i = 0; i < size; i++) {
auto memSize = (size_t) pow(2, i);
void * l = malloc(sizeof(LinkedList));
lists[i] = new (l) LinkedList(memSize);
// Placement new
}
dividingMemory(memorySize, startingPtr);
}
dividingMemory 函数可以:
void MyHashTable::dividingMemory(size_t memorySize, void* startingPtr) {
while (memorySize > 0) {
size_t memPow = getLowerLog(memorySize);
auto max = (size_t) pow(2, memPow);
lists[max]->add(ptr); // here is the call to LinkedList::add()
startingPtr = ((char*) startingPtr) + max;
memorySize -= max;
}
}
LinkedList::add() :
void LinkedList::add(void * ptr) {
void* p = malloc(sizeof(Node));
Node * newNode = new (p) Node(ptr);
// Placement new
newNode->setNext(head);
std::cout << "haha" << std::endl;
head = newNode;
size++;
}
整个节点类: 节点.h:
#ifndef EX3_NODE_H
#define EX3_NODE_H
#include <iostream>
#include <string>
class Node {
private:
void* ptr;
Node* next;
public:
explicit Node(void*);
inline Node* getNext() const {
return next;
}
inline void setNext(Node* next) {
this->next = next;
}
~Node() = default;
};
#endif //EX3_NODE_H
Node.cpp:
Node::Node(void * ptr):ptr(ptr) { }
我尝试调用另一个函数 (toString),但它退出了。
我做错了什么?
我尝试了@Ben Voigt 的答案,但没有解决。
【问题讨论】:
-
new的使用通常称为“新位置”。 -
@FrançoisAndrieux 是的,我知道..这就是为什么它出现在 malloc 之后..
-
这不是一个最小的、完整的和可验证的例子。
-
还有一个问题:
MyHashTable::dividingMemory() 中的行:lists[key]->add(ptr);:key和ptr来自哪里?
标签: c++ placement-new