for(int i = 0; i < stringList.size(); ++i)
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
"Qt's documentation on QTableWidget suggests that the proper way to populate a QTableWidget is to allocate a QTableWidgetItem on heap then set it on a table cell with setItem() just like i presented in the code above, which I find to be weird..."
I don't find it weird, considering that the documentation for QTableWidget::setItem says explicitly that the widget takes ownership of the item!
"Setting the row count to '0' does not seem to delete the heap allocated QTableWidgetItems, it just seems to leave ownership of the items, so it leaves a memory leak. (or at least i just think so...)"
Rather than guessing whether it's leaking or not, you could create your own subclass of QTableWidgetItem...and put code in its destructor so you have a place to put a breakpoint and know for sure. Alternatively, the Qt sources are quite legible.
removeRows, which does indeed delete QTableWidgetItems:
But this is again consistent with the documentation for QTableWidget::setRowCount
Sets the number of rows in this model to rows. If this is less than rowCount(), the data in the unwanted rows is discarded.
You really shouldn't be seeing much of a difference between clearContents() and setRowCount(0). Have you generated a small reproducible example, not entwined in any larger program, that demonstrates this phenomenon?