显式调用"运算符 new"后无法访问对象的函数

Can't access object's function after calling `operator new` explicitly

本文关键字:访问 对象 函数 调用 运算符 new      更新时间:2023-10-16

我正在做一个项目,我必须实现new operatordelete 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);