结构的C ++内存分配

时间:2015-10-18 05:55:41

标签: c++ memory dynamic-memory-allocation

我被赋予了创建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>

有人能说出我可能遇到的错误吗?这是为两个指针结构分配内存的正确方法吗?

2 个答案:

答案 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语句。直接charsigned还是unsigned是实现定义的。如果是signed,则char可以容纳的最大值不能保证能够保持大于127的值。这导致转换为char具有未定义的行为。

作为部分修复,请更改RANDOMBLOCK以包含std::vector<unsigned char> RandomData并完全删除成员ulRandomLenpRandomData。然后将功能更改为

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