显式调用"运算符 new"后无法访问对象的函数
Can't access object's function after calling `operator new` explicitly
我正在做一个项目,我必须实现new operator
和delete operator
,并通过我自己的内存管理器管理我的内存 - 它具有可用内存列表。
为了分配我的列表和节点(不需要管理(,我应该在调用malloc
后显式调用operator new
。
当我尝试调用一个函数 - setNext()
时,它会抛出异常:异常:EXC_BAD_ACCESS(代码 = 1,地址 = 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;
}
}
链接列表::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
节点.cpp:
Node::Node(void * ptr):ptr(ptr) { }
我尝试调用另一个函数(toString(,但它脱离了。
我做错了什么?
我尝试@Ben Voigt的答案,但没有解决它。
你正在丢弃放置new
的返回值,这是获取指向新构造对象的指针的唯一形式上正确的方法。 然后,在传递到放置 new 的原始存储指针上调用成员函数。 别这样。
这是将 malloc 与放置 new 一起使用的正确方法:
void* rawBlock = malloc(sizeof(Node));
Node* newNode = new (rawBlock) Node(ptr);
// later
newNode->~Node();
free(rawBlock);
逻辑错误,我试图访问一个未定义的内存位置。
auto max = (size_t) pow(2, memPow);
lists[max]->add(ptr);
应该是:
auto max = (size_t) pow(2, memPow);
lists[(log(max) / log(2)]->add(ptr);
相关文章:
- 使用迭代器时如何访问对象在向量中的位置?
- 无法通过指针访问对象的成员
- 如何从传递到对象的对象内部访问对象的类属性?
- 有没有办法在C++中循环访问对象的不同数据成员
- 如何访问对象动态数组中的私有成员变量?
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- 访问对象的取消引用值的语法
- 如何访问对象的成员变量的取消引用值
- C++:访问对象内部子对象的方法
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 是否可以从 C++ 中的构造函数访问对象名称?
- 仅允许访问对象的成员,而不允许访问对象本身
- 从地图访问对象会导致新对象C 的实例化
- 如何在数组中访问对象内的字符串
- 在C 中运行时从指针访问对象实例
- 有关使用矢量迭代器访问对象方法的问题
- 当对象的指针存储在矢量中时,如何访问对象中的方法?
- 显式调用"运算符 new"后无法访问对象的函数
- 尝试访问对象数组中的对象,但只保存了一个对象