Hi all,<br><br><font><font>Has anyone used rabbitmq-c with high availability configuration?<br><br></font></font>I
 am stuck with a memory corruption when using rabbitmq-c with high 
availability configuration in my own code (the crash is not in librabbitmq). For HA, since the nodes names have to be 
taken from a config file, I have implemented the following way of 
getting the key value params.<br>
<br><br><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp; std::map&lt;std::string, std::vector&lt;std::string&gt; &gt;ha_map;</font></span></font></font></font></font></font></font></font></font></font></font></font><br><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp; // Load the map here. Typical values:<br></font></span></font></font></font></font></font></font></font></font></font></font></font><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp; // x-ha-policy<font face="tahoma,sans-serif"> - </font>nodes<font face="tahoma,sans-serif">;</font> x-ha-policy-params<font face="tahoma,sans-serif"> - </font>rabbit@centos,rabbit@centos<br><br></font></span></font></font></font></font></font></font></font></font></font></font></font><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp; amqp_table_t table;<br></font></span></font></font></font></font></font></font></font></font></font></font></font></font></span></font></font></font></font></font></font></font></font></font></font></font>&nbsp;&nbsp; std::vector&lt;amqp_field_value_<wbr>t_ *&gt; array_ptrs;<br>
<br>&nbsp;&nbsp; memset(&amp;table, 0, sizeof(table));<br>&nbsp;&nbsp; table.num_entries = ha_map.size();<br>&nbsp;&nbsp; if (table.num_entries)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries = (amqp_table_entry_t *) calloc(1, sizeof(amqp_table_entry_t) * table.num_entries);<br>
&nbsp;&nbsp; int i = 0;<br><br>&nbsp;&nbsp; std::map&lt;std::string, std::vector&lt;std::string&gt; &gt;::const_iterator it;<br>&nbsp;&nbsp; for (it = ha_map.begin(); it != ha_map.end(); it++, i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].key.len = (*it).first.size();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].key.bytes = (void *) (*it).first.c_str();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((*it).second.size() == 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.kind = AMQP_FIELD_KIND_UTF8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>bytes.len = (*it).second[0].size();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>bytes.bytes = (void *) (*it).second[0].c_str();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ((*it).second.size() &gt; 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.kind = AMQP_FIELD_KIND_ARRAY;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>array.num_entries = (*it).second.size();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; amqp_field_value_t *f = (amqp_field_value_t_ *) malloc(sizeof(amqp_field_<wbr>value_t_) * (*it).second.size());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_ptrs.push_back(f);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>array.entries = f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogInfo(("Before pointer: %p", table.entries[i].value.value.<wbr>array.entries));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (size_t j = 0; j &lt; (*it).second.size(); j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>array.entries[j].kind = AMQP_FIELD_KIND_UTF8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>array.entries[j].value.bytes.<wbr>len = (*it).second[j].size();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table.entries[i].value.value.<wbr>array.entries[j].value.bytes.<wbr>bytes = (void *) (*it).second[j].c_str();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogInfo(("Before1 pointer: %p", table.entries[i].value.value.<wbr>array.entries));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; amqp_queue_declare_ok_t *r =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; amqp_queue_declare(m_conn, m_channel, amqp_cstring_bytes(m_queue.c_<wbr>str()), 0, 1, 0, 0, table);<br><br>&nbsp;&nbsp; for (size_t i = 0; i &lt; array_ptrs.size(); i++) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(array_ptrs[i]);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; free(table.entries);<br><br><font><font face="tahoma,sans-serif">This works perfectly fine. But the <font>crash happens when I <font>replace<br></font></font></font></font><br>
<font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font><font face="tahoma,sans-serif"><font><font><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp; for (size_t i = 0; i &lt; array_ptrs.size(); i++) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(array_ptrs[i]);<br>&nbsp;&nbsp; }<br></font><br></span></font></font></font></font></font></font></font></font></font></font></font></font></span></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></span></font></font></font></font></font></font></font></font></font></font></font><font><font face="tahoma,sans-serif">with<br>
</font></font><font><span style="font-family:courier new,monospace">&nbsp;&nbsp; for (int k = 0; <font>k</font> &lt; table.num_entries; k++) {<br></span></font><font><span style="font-family:courier new,monospace"><font><font face="tahoma,sans-serif"><font><font><font><font><font><font><font><font><font><span style="font-family:courier new,monospace"><font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogInfo(("After pointer: %p", table.entries[i].value.value.<wbr>array.entries));<br></font></span></font></font></font></font></font></font></font></font></font></font></font></span></font><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(table.entries[k].value.<wbr>value.array.entries);</b><br>&nbsp;&nbsp; }<br><br>
<font>The "After pointer:" is never the same as "Before pointer:". What wrong am I <font>doing here?</font></font><br><br><font>Thanks,<br><font>Arun<br><br>PS: I'm using the following diagnostic log library: https://github.com/visionofarun/CPPLogger<br></font></font>