[英]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.