我被赋予了创建dll的任务,我需要为结构分配和释放内存。不幸的是,我不知道如何检查代码是否有效。
<div style="min-height:300px;
display: block;">
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv020103").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","http://www.jonasweb.net/samples.php",true);
xmlhttp.send();
}
if(window.addEventListener){
window.addEventListener('load',loadXMLDoc,false); //W3C
}
else{
window.attachEvent('onload',loadXMLDoc); //IE
}
</script>
<div width="100%" id="myDiv020103"></div>
</div>
<div style="clear:both"></div>
有人能说出我可能遇到的错误吗?这是为两个指针结构分配内存的正确方法吗?
答案 0 :(得分:0)
ppRandomBlock = (RANDOM_BLOCK**)malloc(sizeof(RANDOM_BLOCK));
不好。我怀疑它需要:
*ppRandomBlock = (RANDOM_BLOCK*)malloc(sizeof(RANDOM_BLOCK));
更好的是,由于您使用的是C ++,请将功能界面更改为:
unsigned long RandBlockFuncs::GenerateRandomBlock(RANDOM_BLOCK*& ppRandomBlock) { ... }
然后,该功能看起来更干净(根本不使用malloc
):
unsigned long RandBlockFuncs::GenerateRandomBlock(RANDOM_BLOCK*& ppRandomBlock) {
try {
srand(time(NULL));
ppRandomBlock = new RANDOM_BLOCK;
int random = rand() % 129;
(*ppRandomBlock).ulRandomLen = random;
(*ppRandomBlock).pRandomData = new unsigned char[random];
for (int i = 0; i < random; i++) {
(*ppRandomBlock).pRandomData[i] = (char)(rand() % 256);
}
return 0;
}
catch (exception& e) {
return -1;
}
}
答案 1 :(得分:0)
我认为RANDOMBLOCK
是一种struct
类型,其中包含(至少)两个成员 - ulRandomLen
,其类型为int
(不能代表其名称)和pRandomData
是指向unsigned char
的指针类型。
基于这些假设,代码存在以下问题
unsigned long
,并返回-1
。那(幸运的是)具有明确定义的效果 - 它返回unsigned long
可以表示的最大值。但是,这可能不是调用者所期望的。srand()
。这将 - 除非程序运行很长时间 - 重新初始化随机数种子,并导致rand()
返回相同的随机值序列。您需要确保srand()
仅在第一次调用rand()
之前在COMPLETE程序中被称为ONCE。ppRandomBlock = (RANDOM_BLOCK**)malloc(sizeof(RANDOM_BLOCK))
需要分配sizeof(RANDOMBLOCK *)
,而不是sizeof(RANDOM_BLOCK)
。更好的是,将该语句替换为ppRandomBlock = new (RANDOM_BLOCK *)
,并避免需要担心大小调整。RANDOMBLOCK
,并且*ppRandomBlock
未初始化。这会导致所有通过**ppRandomBlock
的访问都具有未定义的行为。因此,需要后跟*ppRandomBlock = new RANDOMBLOCK
。for
属于(*ppRandomBlock).pRandomData[i] = (char)(rand() % 256)
,但内部pRandomData[i]
循环仍有unsigned char
语句。直接char
是signed
还是unsigned
是实现定义的。如果是signed
,则char
可以容纳的最大值不能保证能够保持大于127
的值。这导致转换为char
具有未定义的行为。作为部分修复,请更改RANDOMBLOCK
以包含std::vector<unsigned char> RandomData
并完全删除成员ulRandomLen
和pRandomData
。然后将功能更改为
unsigned long RandBlockFuncs::GenerateRandomBlock(RANDOM_BLOCK*& ppRandomBlock)
{
try
{
// assume `srand()` has been called, for example, in main()
ppRandomBlock = new RANDOM_BLOCK;
int random = rand() % 129;
ppRandomBlock.RandomData.resize(random);
for (int i = 0; i < random; i++)
{
ppRandomBlock.RandomData[i] = (unsigned char)(rand() % 256);
}
return 0;
}
catch (exception& e)
{
return -1;
}
}
请注意,上述内容无法解决unsigned
返回类型和-1
返回值的问题。
更一般地说,OP代码中的首要问题是,它是将一些C代码 - 装饰 - 粗略地翻译成C ++。即使它是很好的C代码,好的C技术并不总是很好的C ++技术,反之亦然。而且,从表面上看,原始代码涉及C语言中的不良技术。
最好完全重写代码以使用C ++库功能(我已经演示了其中的一个元素,更多可能)并且根本不直接使用运算符new
。