Witam.
Mam taki kod:

#include <iostream>
#include <stdio.h>
#include <string>

#define SSIZE 100

struct m_struct {
  int a;
  std::string opis;

  m_struct(std::string _name):opis(_name){}
  
  ~m_struct(){
    std::cout << "Destruktor struktury " << opis << "!" <<  std::endl;
  }
};

void funkcja1(m_struct **structTab)
{
  int licznik  = 0;
  while(*(structTab+licznik))
  {
    std::cout << (*(structTab+licznik))->opis << std::endl;
    licznik++;
  }
  return;
}

m_struct** funkcja2(m_struct **t)
{
  return t;
}

m_struct** funkcja3()
{
  m_struct **m = new m_struct*[SSIZE]; 
  for(int i(0); i<SSIZE; i++){
    *(m+i) = NULL;
  }

  m_struct *k1 = new m_struct("K1");
  m_struct *k2 = new m_struct("K2");
  m_struct *k3 = new m_struct("K3");

  *(m+0) = k1; 
  *(m+1) = k2;
  *(m+2) = k3;
  
  /* ~~~ 4 ~~~  */
  return m;

}

int main()
{
  // new & delete
  m_struct *structA = new m_struct("Struct A");
  m_struct *structB = new m_struct("Struct B");
  m_struct *structC = new m_struct("Struct C");
  m_struct *structD = new m_struct("Struct D");
  m_struct *structE = new m_struct("Struct E");
  m_struct *structF = new m_struct("Struct F");

  
  m_struct **table = new m_struct*[SSIZE]; 
  for(int i(0); i<SSIZE; i++){
    /* ~~~ 1 ~~~ */
    *(table+i) = NULL;
  }
  *(table+0) = structA;
  *(table+1) = structB;
  *(table+2) = structC;
  *(table+3) = structD;
  *(table+4) = structE;
  *(table+5) = structF;


  funkcja1(table);

  m_struct **t1;
  t1 = funkcja2(table);
  funkcja1(t1);
 
  m_struct **t2;
  t2 = funkcja3();
  funkcja1(t2);



  for(int i(0); i<SSIZE; i++)
    delete *(table+i);
  delete []table;

  /* malloc & free */
  m_struct *structA1 = new m_struct("Struct A1");
  m_struct *structB1 = new m_struct("Struct B1");
  m_struct *structC1 = new m_struct("Struct C1");
  m_struct *structD1 = new m_struct("Struct D1");
  m_struct *structE1 = new m_struct("Struct E1");
  m_struct *structF1 = new m_struct("Struct F1");
 
  m_struct **tab_s = (m_struct**)malloc(sizeof(m_struct) * SSIZE);
  for(int i(0); i<SSIZE; i++){
    /* ~~~~ 2 ~~~~ */
    *(tab_s+i) = NULL;
  }

  *(tab_s+0) = structA1;
  *(tab_s+1) = structB1;
  *(tab_s+2) = structC1;
  *(tab_s+3) = structD1;
  *(tab_s+4) = structE1;
  *(tab_s+5) = structF1;

  funkcja1(tab_s);

  /* ~~~ 3 ~~~ */
  for(int i(0);i<SSIZE;i++)
    free(*(tab_s+i));
  free(tab_s);

  return 0;
}

Będę wdzięczny za sprawdzenie powyższego kodu. Mam kilka wątpliwości odnośnie tego programiku:

  1. Tutaj chyba nie trzeba alokować pamięci operatorem new() ? Jeśli się mylę to proszę o poprawkę?
  2. Podobna sytuacja co wyżej z tym, że dotyczy malloc.
  3. Nie uruchamia się destruktor? Czy powinien?
  4. Kiedy zwolnić przydzieloną pamięć?

Gdyby były jakieś inne błędy (niebezpieczne miejsca) to proszę o informację na ten temat.