簡體   English   中英

C++:“拋出異常:讀取訪問沖突。” 將向量分配給另一個時

[英]C++: “Exception thrown: read access violation.” when assigning a vector to the other

我創建了一個名為 Bounds3 的 class,它有一個向量作為其成員變量。 將一個 Bounds3 的實例分配給另一個時會發生錯誤。 我已經通過使用push_back循環而不是使用=運算符復制向量來解決這個問題,但我仍然想知道為什么在使用=運算符分配向量時會發生此錯誤。

Bounds3 class:

template <typename T>
class Bounds3 {
  public:
    ... //public methods

    ... //other public member variables
    std::vector<int> offsets;// the vector
}

錯誤發生的地方:

int BVHAccel::flattenBVHTree(BVHBuildNode *node, int *offset) {
    LinearBVHNode *linearNode = &nodes[*offset];
    linearNode->bounds = node->bounds;// Error happens here: these two "bounds" are instances of Bounds3 class, which belong to the other 2 classes: BVHBuildNode and LinearBVHNode respectively.
    ...
}

當錯誤第一次發生時,我檢查了調用堆棧並認為可能是因為我沒有編寫重載的 "operator=" function 來進行自定義分配,所以我使用以下代碼重載了 = 運算符。

於是我寫了這么一個重載的=操作符function:

Bounds3<T> &operator=(const Bounds3<T> &b) {
    ...// copy other member variables
    offsets = b.offsets; // error happens here
    return *this;
}

錯誤仍然存在,這可能是因為沒有使用=分配向量的此類重載運算符時的默認行為。 因此,我修改了 function:

Bounds3<T> &operator=(const Bounds3<T> &b) {
    ...// copy other member variables
    for (auto &p : b.offsets) 
        offsets.push_back(p);
    return *this;
}

然后,錯誤消失了。

我已盡力檢查類似的問題,但沒有發現(據我所知)完全相同的問題。 我知道在訪問未初始化的 memory 空間時會發生這種情況,例如訪問由某些指針指向的一塊未初始化的 memory 或使用索引訪問空向量的元素,但是=運算符如何無法為向量分配 ZCD69B4957F06CD8291ZBF3 空間? 當我嘗試將向量分配給 vector 時,我在這里發現了一個非常相似的問題“拋出異常:讀取訪問沖突” ,但這可能是因為這個人的向量存儲 shared_ptr 而我的向量只是一個整數向量。)

順便說一句,根據我的設計,這個向量在 Bounds3 實例中可能是空的。 特別是,當上面顯示的賦值發生時, node->bounds中的offsets是空的。 這是問題的原因嗎?

我不熟悉 C++ STL 的底層物流。 希望你能給我一些提示。 提前感謝您的幫助!


編輯:

很抱歉,我無法提供用於復制目的的所有代碼,因為它涉及的代碼太多。 我正在做的是在一個開源項目的文件中修改一個名為 Bounds3 的Bounds3 (第 749 行)。 在我將向量成員添加到此Bounds3 class 后, 此文件中發生錯誤(第 640 行)

在我調查了這個項目的細節之后,我發現原因是Bounds3 class 中的vector<int> offsets在分配發生時根本沒有初始化。

事情是這樣的:本項目自定義了一個AllocAligned function來為代碼中的nodes數組分配空間,即LinearBVHNode *linearNode指向的數組。 然后,這個AllocAligned function 使用_aligned_malloc function 來分配 memory,它不會在linearNode->bounds之間的線性分配和兩個邊界處初始化向量。

BTW,就問題的原因而言,這個問題可能會被標記為重復問題。 這是我在stackoverflow上找到的類似問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM