【发布时间】:2017-04-18 11:11:04
【问题描述】:
我必须集成来自 tetgen(网格生成器)的代码,这显然是经常使用的。但是,我必须使用旧版本(1.4.3 而不是 1.5),这给了我“写访问冲突”。 相关功能在这里:
void tetgenmesh::dummyinit(int tetwords, int shwords)
{
unsigned long alignptr;
// Set up 'dummytet', the 'tetrahedron' that occupies "outer space".
dummytetbase = (tetrahedron *) new char[tetwords * sizeof(tetrahedron)
+ tetrahedrons->alignbytes];
// Align 'dummytet' on a 'tetrahedrons->alignbytes'-byte boundary.
alignptr = (unsigned long) dummytetbase;
dummytet = (tetrahedron *)
(alignptr + (unsigned long) tetrahedrons->alignbytes
- (alignptr % (unsigned long) tetrahedrons->alignbytes));
// Initialize the four adjoining tetrahedra to be "outer space". These
// will eventually be changed by various bonding operations, but their
// values don't really matter, as long as they can legally be
// dereferenced.
dummytet[0] = (tetrahedron) dummytet;
dummytet[1] = (tetrahedron) dummytet;
dummytet[2] = (tetrahedron) dummytet;
dummytet[3] = (tetrahedron) dummytet;
...
...
...
}
'dummytetbase'和'dummytet'都是双***指针,四面体是双**指针。
示例值为:
'tetwords' 是:12.
'(unsigned long)tetrahedrons->alignbytes' : 8.
'tetwords*sizeof( tetrahedron ) + tetrahedrons->alignbytes' 是:104。
'(alignptr % (unsigned long)tetrahedrons->alignbytes)' 是:0。
代码编译得很好,但是当指针从 'dummytet' 转换为 'dummytet[0]' 时,我得到了这个'写访问冲突'。
所以,dummytet 获得了 dummytetbase + 8 的地址。而且 dummytet[x] 获得了所有相同的地址,但这会导致写入冲突。
知道为什么会这样吗? 谢谢!
【问题讨论】:
-
这是来自 tetgen 的原始代码。我一个字都没改……
-
我将 'unsigned long' 替换为 'uint32_t',但写访问冲突仍然存在...
-
如果不进行调试,很难判断到底发生了什么。或许试着找出维护图书馆的电子邮件地址。
-
是的。虽然,在调试时,vs 只是告诉特定地址存在“写访问冲突”。
-
您可以验证 dummytet 的结果指针是否在分配的内存中。此外,内存确实被正确分配并且足够大以容纳四面体
标签: c++ visual-studio pointers tetgen